N - 火星A+B
读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
Input
测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即火星表示法的A+B的值。
Sample Input
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
Sample Output
1,0,1
1,1,1,0
1,0,0,0,0,0
模拟加法,不需要考虑前缀零的情况。
#include<iostream>
#include<cstring>
#include<cmath>
#define maxn 100
using namespace std;
int f(int x)
{
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
return 0;
return 1;
}
int main()
{
int cnt = 0;
int a[maxn];
for(int i=2;cnt<28;i++)
{
if(f(i))
{
a[cnt++] = i;
}
}
char s1[maxn],s2[maxn];
while(cin>>s1>>s2)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
if(len1==1&&s1[0]=='0'||len2==1&&s2[0]=='0')
break;
int l=0;
int c=0;
int ans[100];
int r=0;
//取数处理,模拟加法就可以了
for(int i=len1-1,j=len2-1;i>=0||j>=0;i--,j--)
{
if(i>=0&&s1[i]==','||j>=0&&s2[j]==',')
continue;
int x = c;
int t1=0,t2=0;
if(i>=0)
{
int tmp = 0;
int cnt = 1;
while(s1[i]!=','&&i>=0)
{
tmp+=(s1[i]-'0')*cnt;
cnt*=10;
i--;
// cout<<s1[i]<<"-----"<<endl;
}
t1 = tmp;
i+=1;
// cout<<"Y"<<i<<" ";
}
if(j>=0)
{
int tmp = 0;
int cnt = 1;
while(s2[j]!=','&&j>=0)
{
// cout<<s2[j]<<endl;
tmp+=(s2[j]-'0')*cnt;
cnt*=10;
j--;
}
t2 = tmp;
j+=1;
}
// cout<<t1<<t2<<endl;
x+=t1+t2;
// cout<<x<<endl;
ans[r] = x%a[l];
c = x/a[l];
l++;
r++;
// cout<<c<<endl;
}
if(c)
ans[r++] = c;
int flag = 0;
for(int i=r-1;i>=0;i--)
{
if(flag)
cout<<",";
cout<<ans[i];
flag = 1;
}
cout<<endl;
/*
int x=0,y=0;
int tmp =0;
int cnt =1;
for(int i=len1-1;i>=0;i--)
{
if(s1[i]>='0'&&s1[i]<='9')
{
tmp+=cnt*(s1[i]-'0');
cnt*=10;
}
else if(s1[i]==',')
{
x += a[l++]*tmp;感觉可能会爆炸,放弃。
感觉好像没什么影响,数据量很小,这个应该也能行
}
}*/
}
return 0;
}