-
题目描述:
-
读入两个不超过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
-
-
-
代码:
-
#include<iostream> #include<vector> #include<algorithm> #include<math.h> #include<string> using namespace std; int prime[30]; string a; string b; void getprime(){ int m=3; int t=2; prime[0]=1; prime[1]=2; while(t<30){ int i=2; for(;i<m;i++){ if(m%i==0){ break; } } if(i==m){ prime[t]=m; t++; } m++; } } void getresult(vector<int> num1,vector<int> num2){ reverse(num1.begin(),num1.end()); reverse(num2.begin(),num2.end()); vector<int> result; int minsize,maxsize; if(num1.size()<=num2.size()){ minsize=num1.size();maxsize=num2.size(); }else{ minsize=num2.size();maxsize=num1.size(); } for(int i=minsize;i<maxsize;i++){ if(maxsize==num1.size()){ num2.push_back(0); }else{ num1.push_back(0); } } int c=0; for(int i=0;i<maxsize;i++){ result.push_back((num1[i]+num2[i]+c)%prime[i+1]); c=(num1[i]+num2[i]+c)/prime[i+1]; } if(c>0){ result.push_back(c); } reverse(result.begin(),result.end()); for(int i=0;i<result.size()-1;i++){ cout<<result[i]<<","; } cout<<result[result.size()-1]<<endl; } int main(){ getprime(); while(cin>>a>>b && a!="0"&&b!="0"){ vector<int> num1; vector<int> num2; int temp=0; for(int i=0;i<a.length();i++){ if(a[i]!=','){ temp=temp*10+(a[i]-'0'); }else{ num1.push_back(temp); temp=0; } } num1.push_back(temp); temp=0; for(int i=0;i<b.length();i++){ if(b[i]!=','){ temp=temp*10+(b[i]-'0'); }else{ num2.push_back(temp); temp=0; } } num2.push_back(temp); getresult(num1,num2); } return 0; }