hdu 1230 火星A+B 火星A+B

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230

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 ("
");
91     }
92     return 0;
93 }