火星A+B
Problem Description
Input
Output
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
AC代码:
#include <cstdio>
#include<cstdlib>
#include<cstring>
#define max(a,b) (a>b?a:b)
int s[]={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 a1[100],a2[100],a[100],i,j,k,x,y,b1,b2,b;
int len1,len2;
char s1[200],s2[200];
while(scanf("%s %s",s1,s2)&&(strcmp(s1,"0")!=0||strcmp(s2,"0")!=0))
{
getchar();
memset(a1,0,sizeof(a1)); //注意每次要给数组请0
memset(a2,0,sizeof(a2));
memset(a,0,sizeof(a));
len1=strlen(s1);
len2=strlen(s2);
for(j=0,i=0;i<=len1-1;) //i的值要从0开始,从前向后计算,否则无法表示大于1位的整数
{
if(s1[i]!=',') //如果不是','的话就将它化成整数,因为整数并不都是一位数字,所以不能直接赋值
{
x=0;
for(;s1[i]<='9'&&s1[i]>='0';)//用for循环将字符转换成整数,当s1[i]==','时结束
{
x=x*10+(s1[i]-'0');
i++;
}
a[j++]=x; //要注意j++要放在if里面,因为只有当是数字时才进行赋值,是','时不能进行赋值,先将结果存放在数组a里
}
else //如果是字符的话就直接i++
i++;
}
for(j=j-1,i=0;j>=0;j--,i++) //为了下面的大数加法方便,所以将a数组中的整数倒过来赋值给数组a1
{
a1[i]=a[j];
}
for(j=0,i=0;i<=len2-1;) //对字符串s2的处理同上
{
if(s2[i]!=',')
{
y=0;
for(;s2[i]>='0'&&s2[i]<='9';)
{
y=y*10+(s2[i]-'0');
i++;
}
a[j++]=y;
}
else
i++;
}
for(j=j-1,i=0;j>=0;j--,i++)
{
a2[i]=a[j];
}
for(i=0;i<=99;i++) //大数加法
{
a1[i]+=a2[i];
if(a1[i]>=s[i]&&s[i]!=0)//这里加上S[i]!=0很重要,因为s数组长度为26,且从26位开始s里面存放的是0,数组a1的长度是大于
//26的,所以在26为以上都满足a1[i]>=s[i],这样就会执行a1[i+1]=a1[i+1]+1;这样a1数组中高位存放
//的就不是0了,这样对下面的 for(i=99;i>=0&&a1[i]==0;i--); 判断会有很大的影响
{
a1[i]-=s[i];
a1[i+1]=a1[i+1]+1;
}
}
for(i=99;i>=0&&a1[i]==0;i--); //除去前面不必要的0
for(;i>=1;i--) //因为输入0 0时就结束了,所以就不用判断i<0的情况了,直接将结果输出
{
printf("%d,",a1[i]);
}
printf("%d\n",a1[0]);
}
return 0;
}