---恢复内容开始---

火星A+B

题目描述:
    读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
输入:
    测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即火星表示法的A+B的值。
样例输入:
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
样例输出:
1,0,1
1,1,1,0
1,0,0,0,0,0

这是我第一次写博文,写得不好请大家批评指正哦!
最近在准备保研复试,目前刷一些简单的题目,这道题用了我挺长时间,其实解题思路并不难,就是不注意就会有想不到的地方,然后就各种调错。
调了很长时间之后是下面这样的,注意:这个是错的!!!只试用7进制(包括7进制以内的数)
 1 #include <iostream>
 2 #include <string>
 3 #include <math.h>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string str1, str2;
 9     int x1, x2, y1, y2;
10     int prime[26];
11     prime[0] = 2;
12     int k = 1;
13     int j;
14     for(int i = 3; i < 100; i += 2)
15     {
16         for(j = 3; j < i; j += 2)
17             if(i % j == 0)
18                 break;
19         if(j == i)
20         {
21             prime[k] = i;
22             k++;
23         }
24     }
25 
26     while(cin>>str1>>str2 && str1!="0" && str2!="0")
27     {
28         x1 = x2 = 0;
29         int k = 0;
30         int len1 = str1.size();
31         int len2 = str2.size();
32 
33         for(int i = 0; i < len1; i += 2)
34         {
35             y1 = str1[i] - '0';
36             //cout<<"y1="<<y1;
37 
38             while(k < len1)
39             {
40                 j = len1/2 - 1 - k;
41                 //cout<<" j="<<j<<endl;
42                 while(j >= 0)
43                 {
44                     y1 *= prime[j];
45                     j--;
46                     //cout<<"yy1="<<y1<<endl;
47                 }
48                 k++;
49                 break;
50             }
51             x1 = x1 + y1;
52         }
53 
54         k = 0;
55         for(int i = 0; i < len2; i += 2)
56         {
57             y2 = str2[i] - '0';
58             //cout<<"y2="<<y2;
59 
60             while(k < len2-1)
61             {
62                 j = len2/2 - 1 - k;
63                 //cout<<" j="<<j<<endl;
64                 while(j >= 0)
65                 {
66                     y2 *= prime[j];
67                     j--;
68                     //cout<<"yy2="<<y2<<endl;
69                 }
70                 k++;
71                 break;
72             }
73             x2 = x2 + y2;
74         }
75 
76         //cout<<x1<<" "<<x2<<endl;
77         int i = 0;
78         int rem[25];
79         int quo = x1+x2;
80         //cout<<quo<<endl;
81         while(quo != 0)
82         {
83             rem[i] = quo % prime[i];
84             quo /= prime[i];
85             //cout<<rem[i]<<" "<<quo<<" "<<i<<endl;
86             i++;
87         }
88         //cout<<i<<endl;
89         for(int j = i-1; j > 0; j--)
90             cout<<rem[j]<<",";
91 
92         cout<<rem[0]<<endl;
93     }
94     return 0;
95 }
View Code

 

结果是这样的,也就是前两个是正确的,第三个因为有个“10”就不对了,才发现这个错误太愚蠢了,输入的字符串处理不正确。

 

下面是改正之后的,修正了对输入的字符串的处理:

 1 #include <iostream>
 2 #include <string>
 3 #include <math.h>
 4 using namespace std;
 5 
 6 int analyse(string s, int a[])
 7 {
 8     int x = 0;
 9     int j = 0;
10     for(int i = 0; i < s.size(); i++)
11     {
12         if(s[i] == ',')
13         {
14             a[j++] = x;
15             x = 0;
16             continue;
17         }
18         x *= 10;
19         x += s[i]- '0';
20     }
21     a[j++] = x;
22     return j;
23 }
24 
25 int main()
26 {
27     string str1, str2;
28     int x1, x2;
29     int prime[26];
30     prime[0] = 2;
31     int k = 1;
32     int j;
33     for(int i = 3; i < 100; i += 2)
34     {
35         for(j = 3; j < i; j += 2)
36             if(i % j == 0)
37                 break;
38         if(j == i)
39         {
40             prime[k] = i;
41             k++;
42         }
43     }
44 
45     while(cin>>str1>>str2 && str1!="0" && str2!="0")
46     {
47         x1 = x2 = 0;
48         int y1[30], y2[30];
49 
50         int len1 = analyse(str1, y1);
51         int len2 = analyse(str2, y2);
52         int k;
53         for(int i = 0; i < len1 - 1; i++)
54         {
55             k = 0;
56             //cout<<"y1="<<y1[i]<<" ";
57             while(k < len1 - 1 - i)
58             {
59                 y1[i] = y1[i]*prime[k];
60                 k++;
61             }
62             //cout<<"y1="<<y1[i]<<" ";
63             x1 += y1[i];
64         }
65         x1 += y1[len1-1];
66 
67         for(int i = 0; i < len2 - 1; i++)
68         {
69             k = 0;
70             cout<<"y2="<<y2[i]<<" ";
71             while(k < len2 - 1 - i)
72             {
73                 y2[i] = y2[i]*prime[k];
74                 k++;
75             }
76             x2 += y2[i];
77         }
78         x2 += y2[len2-1];
79         cout<<x1<<" "<<x2<<endl;
80         int i = 0;
81         int rem[25];
82         int quo = x1+x2;
83         //cout<<quo<<endl;
84         while(quo != 0)
85         {
86             rem[i] = quo % prime[i];
87             quo /= prime[i];
88             //cout<<rem[i]<<" "<<quo<<" "<<i<<endl;
89             i++;
90         }
91         //cout<<i<<endl;
92         for(int j = i-1; j > 0; j--)
93             cout<<rem[j]<<",";
94 
95         cout<<rem[0]<<endl;
96     }
97     return 0;
98 }
View Code

结果正确:

总结:这道题只要能将字符串正确处理,再注意一些计算的细节,就可以。

 

 

---恢复内容结束---

posted on 2017-07-27 17:20  小小糖果tt  阅读(65)  评论(0)    收藏  举报