ZOJ 2529 题解

    题目链接

    又是一道CYJJ出的题目,比较有意思。

    题目的意思是给出两个数,做A+B运算,当然这可不是1001,这两个数的表示方法不简单,每一位的进制不同,从右向左,第i位的进制我第i个素数,比 如"1,0"表示的十进制数字是2,因为第一位是0,进位到第二位了,于是就是2,比如"1,0,0",就是6了,经过两次进位到了进制是5的一位,题目 看懂了做起来就简单了,以前看好几遍一直不知道题目讲的是什么,当然,这可不是CYJJ的错,只是我的英语水平差啦。。

    看上去好像是要大数表示法去做,其实不用,在一位一位的进行处理就行了,第i位的加法是第i位的两个数字a,b相加,再加上前面得到的进位co,得到一个 sum,将sum除prime[i]取余就是结果的第i位,sum除以prime[i]就是下一个进位,这样不断的做下去,直到做完为止。这倒是跟逻辑计 算机中的串行进位加法器有点像,呵呵。

    附上代码:in C++


代码
 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 #include<algorithm>
 5 #include<stack>
 6 #include<cstdio>
 7 using namespace std;
 8 
 9 int main()
10 {
11 stack<int> va,vb;
12 int num ;
13 char c ;
14 int p[]={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};
15 
16 while(scanf("%d",&num) != EOF)
17 {
18    va.push(num);
19    c = getchar();
20    while(c == ',')
21    {
22     scanf("%d",&num);
23     va.push(num);
24     c = getchar();
25    }
26    scanf("%d",&num);
27    vb.push(num);
28    c = getchar();
29    while(c == ',')
30    {
31     scanf("%d",&num);
32     vb.push(num);
33     c = getchar();
34    }
35    int n = max(va.size(),vb.size());
36    stack<int> res;
37    int co = 0;
38    int a , b ;
39    for(int i = 0 ; i < n ; i ++)
40    {
41     if(!va.empty())
42     {
43      a = va.top();
44      va.pop();
45     }
46     else a = 0;
47     if(!vb.empty())
48     {
49      b = vb.top();
50      vb.pop();
51     }
52     else b = 0;   
53     int sum = a + b + co;
54     res.push(sum % p[i]);
55     co = sum / p[i] ;
56    }
57    for(int i = n ; co != 0 ; i ++)
58    {
59     res.push(co % p[i]);
60     co = co / p[i] ;
61    }
62    cout<<res.top();
63    res.pop();
64    while(!res.empty())
65    {
66     cout<<","<<res.top();
67     res.pop();
68    }
69    cout<<endl;
70 }
71 
72 return 0;
73 }


posted on 2010-02-05 01:49  vivy  阅读(263)  评论(0编辑  收藏  举报