http://acm.hdu.edu.cn/showproblem.php?pid=1230
感觉压根没看明白题目意思。
后来逐步仔细审题,其实也是一道模拟题,模拟人在做A+B的方式来编程。
十进制38=1*5*3*2+1*3*2+1*2
两个火星数相加不用将它化成10进制在相加再化回去,有更直接的办法即火星数的各个位分别相加,再考虑上进位(carry)。
#include<iostream> #include<algorithm> #include<string> using namespace std; int x[30],y[30]; int prim[30]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113}; int main() { string a,b;//存储读入的火星数 int j=0,k=0;//用于保存火星数的位数 while(cin>>a>>b&&a!="0"&&b!="0") { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); j=0,k=0; for(int i=0;i<a.size();i++) { if(a[i]==',') j++; else x[j]=x[j]*10+a[i]-'0';//将字符化为10进制数字 } for(int i=0;i<b.size();i++) { if(b[i]==',') k++; else y[k]=y[k]*10+b[i]-'0'; } reverse(x,x+j+1);//翻转以利于处理 reverse(y,y+k+1); int carry=0;//进位 int len1=j+1,len2=k+1,len=0; bool flag=false; if(len1>len2) { flag=true; swap(len1,len2);//小的在len1,大的在len2 } //cout<<len1<<" "<<len2<<endl; int z[30];//保存结果 for(int i=0;i<len1;i++) { z[i]=x[i]+y[i]+carry; carry = z[i]/prim[i];//进位 z[i] %= prim[i]; } for(int i=len1;i<len2;i++) { int temp=0; if(!flag) temp=y[i]; else temp=x[i]; z[i]=temp+carry; carry = z[i]/prim[i]; z[i] %= prim[i]; } len=len2-1; if(carry) { z[len2]=carry;len=len2;//最高位进位 } for(int i=len;i>=0;i--) { if(i==len) cout<<z[i]; else cout<<","<<z[i];//打印输出 } cout<<endl; } system("pause"); return 0; }AC完毕