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 }
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 }