描述
读入两个不超过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的值。
相当于高精度加法,只不过是每一位的进制数是不一样的。
先把前几个素数写出来:
int p[]={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};
读入2个要相加的字符串,用高精度加法算出来就行了。输入有点麻烦我不知道该用是吗方法…
#include
#include
#include
#include
#include
#include
#define ll long long int
using namespace std;
char a[2000],b[2000];
int aa[2000],bb[2000],res[2000];
int p[]={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};
int main(int argc, char const *argv[]){
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
while(scanf("%s%s",a,b)){
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
memset(res,0,sizeof(res));
int la=strlen(a);
int lb=strlen(b);
if(la==1&&lb==1&&a[0]=='0'&&b[0]=='0')break;
int cnta=0,cntb=0;
for(int i=la-1;i>=0;i--){ //将每一位数储存起来
if(a[i]==',')continue;
if(i>0){
if(a[i]!=','&&a[i-1]!=','){
aa[cnta++]=(a[i-1]-'0')*10+(a[i]-'0');
i--;
}else if(a[i]!=','&&a[i-1]==','){
aa[cnta++]=a[i]-'0';
}
}else if(i==0){
aa[cnta++]=a[i]-'0';
break;
}
}
for(int i=lb-1;i>=0;i--){
if(b[i]==',')continue;
if(i>0){
if(b[i]!=','&&b[i-1]!=','){
bb[cntb++]=(b[i-1]-'0')*10+(b[i]-'0');
i--;
}else if(b[i]!=','&&b[i-1]==','){
bb[cntb++]=(b[i]-'0');
}
}else if(i==0){
bb[cntb++]=b[i]-'0';
break;
}
}
int lll;
lll=cntb>cnta?cntb:cnta;
lll++;
for(int i=0;i<=lll;i++){ //模拟高精度只不过把10进制换成了p[i]对应的进制
res[i]+=aa[i]+bb[i];
res[i+1]+=res[i]/p[i];
res[i]%=p[i];
}
while (res[lll]==0&&lll>0)lll--;
for(int i=lll;i>=0;i--)printf("%d%c",res[i],i==0?'\n':',');
}
return 0;
}
我的智商只能做这种题目了