---恢复内容开始---
火星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进制以内的数)
View Code1 #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 }
结果是这样的,也就是前两个是正确的,第三个因为有个“10”就不对了,才发现这个错误太愚蠢了,输入的字符串处理不正确。
![]()
下面是改正之后的,修正了对输入的字符串的处理:
View Code1 #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 }
结果正确:
![]()
总结:这道题只要能将字符串正确处理,再注意一些计算的细节,就可以。
---恢复内容结束---



浙公网安备 33010602011771号