火星A+B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7833 Accepted Submission(s): 2539
Problem Description
读入两个不超过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
/* Name: 火星A+B Copyright: Author: 火星十一郎 Date: 25-07-25 08:14 Description: */ /*long long的十进制为20位*/ #include<stdio.h> #include<string.h> #include<math.h> /* 不必用素数定理也可估算出1到n的素数个数小于n/2 因为至少去掉所有 偶数,或者开平方 找到可能的最大素数 */ #define N 10000 int vis[N],prim[26],ans[30];//全局数组自动赋值为0 int k1,k2; void is_prim()//不能与数组名同名 { int m=(int)sqrt(N+0.5); int c=0,i,j; memset(vis,0,sizeof(vis)); for(i=2;i<=m;i++) if(!vis[i]) { prim[c++]=i; //printf("%d\n",prim[0]); for(j=i*i;j<=N;j+=i) vis[j]=1; } } void add_output(int *temp1,int *temp2) { int i,j; int len=k1>k2?k1:k2; memset(ans,0,sizeof(ans)); //printf("%d\n",len); for(i=0,j=0;i<len;i++) { ans[i]+=temp1[i]+temp2[i]; if(ans[j]>=prim[i]) { ans[i+1]+= ans[i]/prim[i]; ans[i]%=prim[i]; //printf("%d\n",prim[i]); j++; } else j++; /* 刚开始没加else 代码不对,因为若执行了if里的j++;则有继续执行了for循环体里的j++ */ } if(ans[len]!=0) len++; for(i=len-1;i>=1;i--) printf("%d,",ans[i]); printf("%d\n",ans[0]); } int main() { char str1[100],str2[100]; int temp1[100]={0},temp2[100]={0}; int i,j; int temp,len1,len2; is_prim(); prim[0]=2; /* for(i=0;i<26;i++) printf("%d ",prim[i]); printf("\n"); /*测试后发现,N值太小(125) 改过后 prim[0]=1; 所以必须加上prim[0]=2; */ while(1) { memset(str1,0,sizeof(str1)); memset(str2,0,sizeof(str2)); memset(temp1,0,sizeof(temp1)); memset(temp2,0,sizeof(temp2)); scanf("%s %s",str1,str2); k1=k2=0; if(str1[0]=='0'&&str2[0]=='0') break; len1=strlen(str1); len2=strlen(str2); //为防止最后一个字符未被转化为整形 str1[len1]=','; str2[len2]=','; len1++; len2++; //转化为整形 for(i=0,temp=0,k1=0;i<=len1;i++) { if(str1[i]==',') { temp1[k1++]=temp; temp=0; continue; } temp=temp*10+str1[i]-'0'; } for(i=0,temp=0,k2=0;i<=len2;i++) { if(str2[i]==',') { temp2[k2++]=temp; temp=0; continue; } temp=temp*10+str2[i]-'0'; } //for(i=0;str1[i]!='\0';i++) //逆置 ,j<len1-1不能加等号,因为最后人为加了逗号 for(i=0,j=k1-1;j>=i;i++,j--) { temp=temp1[j];//temp需要时char temp1[j]=temp1[i]; temp1[i]=temp; } for(i=0,j=k2-1;j>=i;i++,j--)//逆置 { temp=temp2[j]; temp2[j]=temp2[i]; temp2[i]=temp; } add_output(temp1,temp2); } return 0; } 做这道题时,原来两个temp没清零,结果同一组数据,每次结果不一样 看来,变量一定要赋初值,数组一定清空