//HDU1230 火星A+B #include<stdio.h> //使用输入输出函数 #include<string.h> //使用字符串函数 int prim[50]; //存储素数列表 int p[250]; //用于筛选素数处理 void makeprime() //筛选法求素数 { int i,j; memset(p,0,sizeof(p)); //初始化数组 for(i=2;i<125;i++) //筛选法求素数 for(j=i+i;j<250;j+=i) p[j]=1; for(i=2,j=0;i<250&&j<50;i++) //形成素数列表 if(!p[i]) prim[j++]=i; } int main() { char x[1000],y[1000],*p; //输入数组,存储原始数据、指针 int a[50],b[50],t; //处理数组,中间变量 int len,lena,lenb;//记录长度 int i,j; //循环变量 makeprime();//产生素数数组 while(scanf("%s%s",x,y)&&x[0]!='0'||y[0]!='0') //初始化 { //初始化处理数组 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); //处理第一个“火星数” lena=0; p=x; while(strstr(p,","))//提取数字 { sscanf(p,"%d",&a[lena++]); p=strstr(p,",")+1; } sscanf(p,"%d",&a[lena]); for(j=0;j<=lena/2;j++)//数字逆序处理[低位放前面,高位放后面,利于进位处理] { t=a[j]; a[j]=a[lena-j]; a[lena-j]=t; } //同上 lenb=0; p=y; while(strstr(p,",")) { sscanf(p,"%d",&b[lenb++]); p=strstr(p,",")+1; } sscanf(p,"%d",&b[lenb]); for(j=0;j<=lenb/2;j++) { t=b[j]; b[j]=b[lenb-j]; b[lenb-j]=t; } //检测输出 /*printf("---------a---------\n"); for(i=0;i<=lena;i++)printf("%d ",a[i]); printf("\n\n"); printf("---------b---------\n"); for(i=0;i<=lenb;i++)printf("%d ",b[i]); printf("\n\n");*/ //加法处理,进位处理 len=lena>lenb?lena:lenb;//提取最大长度 for(i=0;i<=len;i++) { a[i]+=b[i]; //加法处理 if(a[i]>=prim[i]) //进位处理 a[i+1]+=a[i]/prim[i],a[i]=a[i]%prim[i]; } if(a[i]>=prim[i]) //假设最高位需要进位 a[i+1]+=a[i]/prim[i],a[i]=a[i]%prim[i]; if(a[i])len++; //若最高位进位,总体长度加一 //输出答案【中间用逗号隔开,最后要换行】 //printf("ans="); printf("%d",a[len]); for(i=len-1;i>=0;i--)printf(",%d",a[i]); printf("\n"); } return 0; }