HDU_1230——火星A+B,加法进制问题
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 <cstdio> 2 int prime[30]={0}; 3 void init(void) 4 { 5 int i,j,n; 6 for(i=0,n=2;i<30;i++) 7 { 8 for(;;n++) 9 { 10 for(j=2;j<=n/2;j++) 11 { 12 if(n%j==0) 13 break; 14 } 15 if(j>n/2) 16 { 17 prime[i]=n++; 18 break; 19 } 20 } 21 } 22 } 23 int main() 24 { 25 char str[200]; 26 int i,j; 27 init(); 28 while(gets(str)!=NULL) //scanf不接受空格 29 { 30 int a[100]={0},b[100]={0},s[100]={0},n=0,la=0,lb=0; 31 for(i=0;;i++) 32 { 33 if(str[i]==',') 34 { 35 a[la++]=n; 36 i++; 37 n=0; 38 } 39 else if(str[i]==' ') 40 { 41 a[la++]=n; 42 for(i++,n=0;;i++) 43 { 44 if(str[i]=='\0') 45 { 46 b[lb++]=n; 47 break; 48 } 49 if(str[i]==',') 50 { 51 b[lb++]=n; 52 i++; 53 n=0; 54 } 55 n=n*10+str[i]-'0'; 56 } 57 break; 58 } 59 n=n*10+str[i]-'0'; 60 } 61 62 for(la--,lb--,i=0;la>=0&&lb>=0;la--,lb--,i++) 63 { 64 s[i] += a[la]+b[lb]; 65 if(s[i]>=prime[i]) 66 { 67 s[i+1]=s[i]/prime[i]; 68 s[i]=s[i]%prime[i]; 69 } 70 if(la==0&&lb!=0) 71 { 72 for(lb--,i++;lb>=0;lb--,i++) 73 { 74 s[i] += b[lb]; 75 if(s[i]>=prime[i]) 76 { 77 s[i+1]=s[i]/prime[i]; 78 s[i]=s[i]%prime[i]; 79 } 80 } 81 break; 82 } 83 else if(lb==0&&la!=0) 84 { 85 for(la--,i++;la>=0;la--,i++) 86 { 87 s[i] += a[la]; 88 if(s[i]>=prime[i]) 89 { 90 s[i+1]=s[i]/prime[i]; 91 s[i]=s[i]%prime[i]; 92 } 93 } 94 break; 95 } 96 } 97 for(i=99;s[i]==0;i--); 98 for(;i>=0;i--) 99 { 100 printf(i==0?"%d\n":"%d,",s[i]); 101 } 102 } 103 return 0; 104 }
——现在的努力是为了小时候吹过的牛B!!