读入两个不超过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
分析:
使用进制转换太过于麻烦,直接用了加法模拟一下就可以了。
模拟加法操作。
我们拿样例中的 1,0 2,1来说:
个位:0+1+m(m=0)=1 个位值等于(ch1个位+ch2个位)%进制值2,s=1%2=1,进位m=1/2=0;
十位:1+2+m=3 十位值等于(ch1十位+ch2十位)%进制值3,s=3%3=0 进位m=3/3=1;
此时进位m不为0,再向高位进m得百位值为m=1
AC代码:
#include<bits/stdc++.h>
int a[1000],b[1000],s[1000];
char ch1[1000],ch2[1000];
int prime[26]={
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};//进位制
int main()
{
int k1,k2,i=0;
while(scanf("%s%s",ch1,ch2))
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(s,0,sizeof(s));
if(strcmp(ch1,"0")==0&&strcmp(ch2,"0")==0)
break;
int len1=strlen(ch1);
int len2=strlen(ch2);
k1=0;
k2=0;
for(i=0;i<len1;i++)
{
if(ch1[i]==',')
{
k1++;
continue;
}
a[k1]=a[k1]*10+(ch1[i]-'0');
}
for(i=0;i<len2;i++)
{
if(ch2[i]==',')
{
k2++;
continue;
}
b[k2]=b[k2]*10+(ch2[i]-'0');
}
k1++;
k2++;
//逆序数组,模拟加法
for(i=0;i<k1/2;i++)//二分法
{
int t=a[i];
a[i]=a[k1-i-1];
a[k1-i-1]=t;
}
for(i=0;i<k2/2;i++)
{
int t=b[i];
b[i]=b[k2-i-1];
b[k2-i-1]=t;
}
int K;
if(k1>k2)
K=k1;
else
K=k2;
int m=0; //表示进位
for(i=0;i<K;i++) //模拟加法
{
int c=a[i]+b[i]+m;
m=c/prime[i];//进位
s[i]=c%prime[i]; //纪录结果
}
if(m)
s[K++]=m;
for(i=K-1;i>=0;i--) //倒叙输出
if(i==0)
printf("%d\n",s[i]);
else
printf("%d,",s[i]);
}
}
#include<bits/stdc++.h>
int a[1000],b[1000],s[1000];
char ch1[1000],ch2[1000];
int prime[26]={
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};//进位制
int main()
{
while(1)
{
int k1,k2,i=0;
char ch;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(s,0,sizeof(s));
while(scanf("%d%c",&a[i++],&ch))
{
k1=i;
if(ch==' ')
break;
}
i=0;
while(scanf("%d%c",&b[i++],&ch))
{
k2=i;
if(ch=='\n')
break;
}
if(k1==1&&a[0]==0&&k2==1&&b[0]==0)
{
return 0;
}
for(i=0;i<k1/2;i++)
{
int t=a[i];
a[i]=a[k1-i-1];
a[k1-i-1]=t;
}
for(i=0;i<k2/2;i++)
{
int t=b[i];
b[i]=b[k2-i-1];
b[k2-i-1]=t;
}
int K;
if(k1>k2)
K=k1;
else
K=k2;
int m=0;
for(i=0;i<K;i++)
{
int c=a[i]+b[i]+m;
m=c/prime[i];
s[i]=c%prime[i];
}
if(m)
s[K++]=m;
for(i=K-1;i>=0;i--)
{
if(i!=0)
printf("%d,",s[i]);
else
printf("%d\n",s[i]);
}
}
}