题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230
火星A+B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10638 Accepted Submission(s): 3550
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
题目大意:这是我一次比赛,差这一题ak的,无奈,当时说了一句,我一个地球人,怎么知道火星a+b怎么算,比赛结束后,看了下这题是麻烦了些哈~~
把字符转换一下,然后按照大数的思想做下去就ok了,不过我还是转换了好久,把数字一位一位的拿出来,在倒叙相加,最后在倒着输出来!!
详见代码。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int hash[9999],sum[110]; 7 char ch1[110],ch2[110]; 8 int num1[110],num2[110]; 9 int n1[110],n2[110],k1,k2; 10 11 void sushu() 12 { 13 int n,i,k=1;hash[0]=2; 14 for (n=3; n<=9999; n++) 15 { 16 17 for (i=2; i*i<=n; i++) 18 { 19 if (n%i==0) 20 break; 21 else 22 hash[k++]=n; 23 } 24 if (i*i>n) 25 hash[k++]=n; 26 } 27 } 28 29 int main () 30 { 31 sushu(); 32 while (cin>>ch1>>ch2) 33 { 34 if (strcmp(ch1,"0")==0&&strcmp(ch2,"0")==0) 35 break; 36 memset(n1,0,sizeof(n1)); 37 memset(n2,0,sizeof(n2)); 38 memset(num1,0,sizeof(num1)); 39 memset(num2,0,sizeof(num2)); 40 int len1=strlen(ch1); 41 int len2=strlen(ch2); 42 k1=0; 43 for (int i=0; i<len1; i++) 44 { 45 if (ch1[i]==',') 46 { 47 k1++; 48 continue; 49 } 50 num1[k1]=num1[k1]*10+ch1[i]-'0'; 51 } 52 k2=0; 53 for (int i=0; i<len2; i++) 54 { 55 if (ch2[i]==',') 56 { 57 k2++; 58 continue; 59 } 60 num2[k2]=num2[k2]*10+ch2[i]-'0'; 61 } 62 for (int i=k1; i>=0; i--) 63 n1[k1-i]=num1[i]; 64 for (int i=k2; i>=0; i--) 65 n2[k2-i]=num2[i]; 66 67 int K=k1>k2?k1:k2; 68 for (int i=0; i<=K; i++) 69 { 70 if (i==0) 71 sum[i]=n1[i]+n2[i]; 72 else 73 { 74 if (sum[i-1]>=hash[i-1]) 75 sum[i]=n1[i]+n2[i]+1; 76 else 77 sum[i]=n1[i]+n2[i]; 78 } 79 } 80 if (sum[K]>=hash[K]) 81 sum[++K]=1; 82 83 for (int i=K; i>=0; i--) 84 { 85 if (i==K) 86 printf ("%d",sum[i]%hash[i]); 87 else 88 printf (",%d",sum[i]%hash[i]); 89 } 90 printf ("\n"); 91 } 92 return 0; 93 }