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完毕