火星A+B
火星A+B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11713 Accepted Submission(s):
3924
一开始想化成十进制的求每位权值,做了半天结果发现这样不行
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
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 #define LL long long 7 int prime[100]; 8 int flag=0; 9 void GetPrime() 10 { 11 int i,j=0,k; 12 for(i=2;;i++) 13 { 14 flag=0; 15 for(k=2;k<=sqrt(i);k++) 16 { 17 if(i%k==0) 18 { 19 flag=1; 20 break; 21 } 22 } 23 if(!flag) 24 prime[j++]=i; 25 if(j==30) 26 break; 27 } 28 return; 29 } 30 int main() 31 { 32 char a[100],b[100]; 33 GetPrime(); 34 //freopen("in.txt","r",stdin); 35 while(scanf("%s %s",a,b)) 36 { 37 if(a[0]=='0'&&b[0]=='0') 38 break; 39 else 40 { 41 int A[100],B[100],C[100]; 42 memset(A,0,sizeof(A)); 43 memset(B,0,sizeof(B)); 44 memset(C,0,sizeof(C)); 45 int suma=0,sumb=0,k=1,j=0,i=0,sum; 46 int lena=strlen(a),lenb=strlen(b); 47 for(i=lena-1;i>=0;i--) 48 { 49 k=0; 50 while(a[i]!=',') 51 { 52 A[j]+=(a[i]-'0')*pow(10,k); 53 k++; 54 i--; 55 if(i<0) 56 break; 57 } 58 j++; 59 } 60 int ga=j; 61 j=0; 62 for(i=lenb-1;i>=0;i--) 63 { 64 k=0; 65 while(b[i]!=',') 66 { 67 B[j]+=(b[i]-'0')*pow(10,k); 68 k++; 69 i--; 70 if(i<0) 71 break; 72 } 73 j++; 74 } 75 int gb=j; 76 int c=0; 77 for(i=0;i<=25;i++) 78 { 79 C[i]=(A[i]+B[i]+c)%prime[i]; 80 c=(A[i]+B[i]+c)/prime[i]; 81 } 82 for(i=99;i>=0;i--) 83 if(C[i]!=0) 84 break; 85 int count=i; 86 for(;i>0;i--) 87 cout<<C[i]<<','; 88 cout<<C[i]; 89 cout<<endl; 90 } 91 } 92 }