火星A+B
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 13 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
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 想法: 看似进制问题,其实跟进制关系不大,主要用到素数,字符窜处理,和大数处理思想,最重要是解题思路清晰,理解难度不大。 首先我们找出从2到10010素数 ,用c【i】保存i位的进制 然后把火星数字的,去掉(注意我们保存火星数字的是asii码值,记得转化为数字,输入的是从低位到高位而输出的是从高位到低位) 最后要把两个火星数每位数值加起,注意每位数值加法进制不一样,要用到c【i】 火星数字加法代码: for(i=1,d=0;i<=maxx;i++) { cr[i]=c1[i]+c2[i]+d; d=0; if(i==maxx&&cr[i]>=c[i]) { cr[i]=cr[i]%c[i]; cr[++maxx]=1; break; } if(cr[i]>=c[i]) { cr[i]=cr[i]%c[i]; d=1; } } 代码: #include<stdio.h> #include<string.h> #include<math.h> #define M 10010 char a[M],b[M]; int c[M]; int c1[M],c2[M]; int cr[M]; int d1[M]; int max(int x,int y) { return x>y?x:y; } int po(int x1) { int i,sum=1; if(x1==0) return sum; for(i=1;i<=x1;i++) sum*=10; return sum; } int main() { int i,j,n; memset(d1,0,sizeof(d1)); for(i=2;i<=M;i++) for(j=i;i*j<=M;j++) { d1[i*j]=1; } for(i=2,n=1;i<=M;i++) if(d1[i]==0) { c[n++]=i; } while(scanf("%s%s",a,b)!=EOF) { if(a[0]=='0'&&b[0]=='0') break; int len1,len2; len1=strlen(a); len2=strlen(b); memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); memset(cr,0,sizeof(cr)); int l,h,w=0; for(i=len1-1,l=1,w=0;i>=0;i--) { if(a[i]==',') { l++; w=0; } else { c1[l]+=(a[i]-'0')*po(w++); } } for(i=len2-1,h=1,w=0;i>=0;i--) { if(b[i]==',') { h++; w=0; } else { c2[h]+=(b[i]-'0')*po(w++); } } int maxx=max(l,h); int d; for(i=1,d=0;i<=maxx;i++) { cr[i]=c1[i]+c2[i]+d; d=0; if(i==maxx&&cr[i]>=c[i]) { cr[i]=cr[i]%c[i]; cr[++maxx]=1; break; } if(cr[i]>=c[i]) { cr[i]=cr[i]%c[i]; d=1; } } for(i=maxx;i>1;i--) printf("%d,",cr[i]); printf("%d\n",cr[i]); } return 0; }