码迷,mamicode.com
首页 > 其他好文 > 详细

使用数字进行字符遍历

时间:2015-04-23 23:15:43      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

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

如:

输入一个正整数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 }

 

使用数字进行字符遍历

标签:

原文地址:http://www.cnblogs.com/bewolf/p/4451987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!