使用数字进行字符遍历

有些时候使用数字进行遍历,然后将数字转化成需要的进制数,再将进制数对应成需要的字符是一种非常有效的方法。

如:

输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。

1 2 3 4 5 6 7 8 9 = X

比如:

12-34+5-67+89 = 5

1+23+4-5+6-7-8-9 = 5

请编写程序,统计满足输入整数的所有整数个数。

输入: 正整数,等式右边的数字

输出: 使该等式成立的个数

样例输入:5

样例输出:21

结题思路:每两个数字之间的空格都有三种选项:+/-/空,"空"代表不加符号。

将所有数字的符号用一个三进制的数来表示,用1代表+,2代表-,0代表空。10000021,就代表1+2 3 4 5 6 7-8+9

所以,按照三进制的话从0到22222222就可以代表所有的结果的可能了,转换成十进制就是从0到6560。

下面程序中要注意,要遍历的数转换成三进制的字符串的长度小于8的时候需要在前面补0。

 1 #include<iostream>
 2 #include<ctype.h>
 3 #include<string>
 4 using namespace std;
 5 string to3(int num)
 6 {
 7     string str;
 8     char c[100];
 9     itoa(num,c,3);
10     str=c;
11     if(str.length()<8)
12     {
13         str.insert(0,8-str.length(),‘0‘);
14     }
15     return str;
16 }
17 int main()
18 {
19     int N;
20     cin>>N;
21     int count=0;
22     string snum="123456789";
23     //1+ 2- 0空格
24     for(int num=0;num<6561;num++)
25     {
26         string str=to3(num);
27         string ::iterator it=snum.begin();
28         string rstr;
29         for(int i=0;i<8;i++)
30         {
31             rstr.push_back(snum[i]);
32             if(str[i]==‘1‘)
33             {
34                 rstr.push_back(‘+‘);
35             }
36             else if(str[i]==‘2‘)
37             {
38                 rstr.push_back(‘-‘);
39             }
40         }
41         rstr.push_back(snum[8]);//rstr已经变成12+3-4+567-89的格式
42         int len=rstr.length();
43         int num[9];
44         int n=0;
45         string::iterator p1,p2;
46         p1=p2=rstr.begin();
47         string fuhao;
48         while(p1!=rstr.end())
49         {
50             while(p1-rstr.begin()<len &&isdigit(*p1))
51             {
52                 p1++;
53             }
54             if(p1!=rstr.end()&&(*p1==‘+‘||*p1==‘-‘))
55             {
56                 fuhao.push_back(*p1);
57             }
58             string s_num=rstr.substr(p2-rstr.begin(),p1-p2);
59             num[n++]=atoi(s_num.c_str());
60             if(p1<rstr.end())
61             {
62                 p1++;
63                 p2=p1;
64             }
65
66         }
67         int sum=num[0];
68         for(int i=0;i<n-1;i++)
69         {
70             if(!fuhao.empty())
71             {
72                 if(fuhao[i]==‘+‘)
73                 {
74                     sum=sum+num[i+1];
75                 }
76                 if(fuhao[i]==‘-‘)
77                 {
78                     sum=sum-num[i+1];
79                 }
80             }
81         }
82         if(sum==N)
83         {
84             count++;
85         }
86
87     }
88     cout<<count;
89     return 0;
90 }
时间: 2024-12-20 22:16:50

使用数字进行字符遍历的相关文章

18 PHP数字与字符运算 do while ,for 数组 函数 局部通信 时间日期

转义字符 赋值传值/引用传值 [PHP中的数字与字符运算] do while循环 for循环 红白黑球问题 [提高代码质量--红白黑球问题] 赋值传值和引用传址 数组 枚举数组 关联数组 数组的创建 使用array()函数创建数组 重载数组下标 多维数组 数组操作函数 print_r() unset() count() foreach() 数组元素的删除和增加函数 array_shift() array_values() list() 计算机运行时间计算 函数的概念 函数的语法结构 函数结构说明

LCD1602 显示数字,字符,自定义字符,字符串,光标

/******************************************* 程序名:   1602液晶屏时钟程序 编写时间: 2015年10月4日 硬件支持: LCD1602液晶屏  STC12C4052AD 外部12MHZ晶振  接线定义:  DB0_DB7 --> P1^0 --P1^7 RS   = P3 ^ 2;         RW   = P3 ^ 3;   E    = P3 ^ 4;   功能:测试LCD1602的显示,显示时间,http://990487026.b

LCD1602显示,用4位总线显示数字,字符,自定义字符,字符串,光标

/******************************************* 程序名:   1602液晶屏时钟程序 编写时间: 2015年10月4日 硬件支持: LCD1602液晶屏  STC12C4052AD 外部12MHZ晶振  接线定义: DB7 --> P1^7 DB6 --> P1^6 DB5 --> P1^5 DB4 --> P1^5 RS   = P3 ^ 2;   RW   = P3 ^ 3;   E    = P3 ^ 4;   功能:LCD1602显

【python】字符遍历

Python为我们提供了很多便捷的方式去遍历一个字符串中的字符.比如,将一个字符串转换为一个字符数组(列表): theList = list(theString) 同时,我们可以方便的通过for语句进行遍历: for c in theString:        do_something_with(c) map函数用法: 第一个参数接收一个函数名,第二个参数接收一个可迭代对象 lt = [1, 2, 3, 4, 5, 6] def add(num): return num + 1 rs = ma

js面试题--------JS中数字和字符,布尔类型相加相减问题

JS中数字和字符相加相减问题 <html lang="en"> <head> <meta charset="utf-8" /> <title></title> </head> <body> </body> </html> <script type="text/javascript"> var a = 100; var b = &

生成随机数字,字符

1.让每次启动程序运行都能产生不同的随机数: #include <cstdlib> int main() { srand(time(0));// set a new seed for random function } 2.产生随机数 在srand statement 之后: (1)产生0到a的随机数:rand%(a+1); eg:产生0到9:rand%(10): (2)产生a到b的随机数:a + rand(b-a+1): eg:产生50到99: 50+rand%50: (3)产生p到q的随机

华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。

1 package 华为机试; 2 //C++ 输入:由数字和字母组成的字符串,例如:333aaabb55ppin 3 //输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin. 4 5 //这句话的核心就是在字符串删除一些字符,感觉处理很复杂,删除哪些字符呢?我们观察发现, 本字符串中删除了一个3,一个a,一个p,满足的规则是啥呢? 333中删除最后一个3,3aa删除了一个a,5pp中删除一个p, 6 //规

【 C语言】将一个数字按字符形式逐个输出,例如1234,输出为1 2 3 4

//将一个数字按字符形式逐个输出,例如1234,输出为1 2 3 4 #include <stdio.h> void print_number(int a) { if (a >= 10) print_number(a / 10); printf("%d ", a % 10); } int main() { int a = 1234; print_number(a); printf("\n"); return 0; } 版权声明:本文为博主原创文章,

QTableWidgetItem默认编辑时,不是数字的字符也能输入。怎么

QTableWidgetItem默认编辑时,不是数字的字符也能输入.如何设置不是数字的就不能输入?QTableWidgetItem默认 QTableWidgetItem默认编辑时,不是数字的字符也能输入.如何设置不是数字的就不能输入?QTableWidgetItem默认编辑时,不是数字的字符也能输入.如何设置不是数字的就不能输入? [解决办法]QRegExp ipRegExp = QRegExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){4}");