九度oj 题目1016:火星A+B

题目描述:
    读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
输入:
    测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即火星表示法的A+B的值。
样例输入:
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
样例输出:
1,0,1
1,1,1,0
1,0,0,0,0,0
这道题比较诡异,题目中说两个不超过25位的A,B是指int数组不超过25位,而转化为char后就不止25位了,因为这个原因run time error了两次,代码如下
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <string>
 5 #define MAX 300
 6 int prom[MAX] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107};
 7 char A[MAX];
 8 char B[MAX];
 9 int ans[MAX];
10 
11 int isNEnd() {
12     if(strcmp(A,"0") == 0 && strcmp(B,"0") == 0) {
13         return 0;
14     }
15     else {
16         return 1;
17     }
18 }
19 
20 int main(int argc, char const *argv[])
21 {
22     memset(A,-1,sizeof(A));
23     memset(B,-1,sizeof(B));
24 
25     scanf("%s %s",A,B);
26     while(isNEnd()) {
27         int lenA = strlen(A);
28         int lenB = strlen(B);
29         int i = lenA - 1, j = lenB - 1;
30         int wtemp = 0;
31         int bitb = 0;
32         int bitc = 0;
33         while(i >= 0 || j >= 0) {
34             int i0 = i;
35             int j0 = j;
36             int numa = 0, numb = 0;
37             while(i >= 0 && A[i] != ',') {
38                 //printf("%d
",A[i]);
39                 i--;
40             }
41             if(i0 >= 0) {
42                 for(int k = i + 1; k <= i0; k++) {
43                     numa = numa * 10 + A[k] - '0';
44                 }
45             }
46             
47 
48             while(j >= 0 && B[j] != ',') {
49                 //printf("%d
",B[j]);
50                 j--;
51             }
52             if(j0 >= 0) {
53                 for(int k = j + 1; k <= j0; k++) {
54                 numb = numb * 10 + B[k] - '0';
55                 }
56             }
57             
58 
59             int bit = numa + numb + bitc;
60             bitb = bit % prom[wtemp];
61             bitc = bit / prom[wtemp];
62             ans[wtemp] = bitb;
63             i--;
64             j--;
65             wtemp++;
66         }
67         if(bitc != 0) {
68             ans[wtemp] = bitc;
69             wtemp++;
70         }
71         for(int i = wtemp -1; i >= 1; i--) {
72             printf("%d,",ans[i]);
73         }
74         printf("%d
",ans[0]);
75         scanf("%s %s",A,B);
76     }
77  
78     return 0;
79 }
原文地址:https://www.cnblogs.com/jasonJie/p/5678404.html