1074 宇宙无敌加法器

地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个 PAT 星人都必须熟记各位数字的进制表,例如“……0527”就表示最低位是 7 进制数、第 2 位是 2 进制数、第 3 位是 5 进制数、第 4 位是 10 进制数,等等。每一位的进制 d 或者是 0(表示十进制)、或者是 [2,9] 区间内的整数。理论上这个进制表应该包含无穷多位数字,但从实际应用出发,PAT 星人通常只需要记住前 20 位就够用了,以后各位默认为 10 进制。

在这样的数字系统中,即使是简单的加法运算也变得不简单。例如对应进制表“0527”,该如何计算“6203 + 415”呢?我们得首先计算最低位:3 + 5 = 8;因为最低位是 7 进制的,所以我们得到 1 和 1 个进位。第 2 位是:0 + 1 + 1(进位)= 2;因为此位是 2 进制的,所以我们得到 0 和 1 个进位。第 3 位是:2 + 4 + 1(进位)= 7;因为此位是 5 进制的,所以我们得到 2 和 1 个进位。第 4 位是:6 + 1(进位)= 7;因为此位是 10 进制的,所以我们就得到 7。最后我们得到:6203 + 415 = 7201。

输入格式:

输入首先在第一行给出一个 N 位的进制表(0 < N ≤ 20),以回车结束。 随后两行,每行给出一个不超过 N 位的非负的 PAT 数。

输出格式:

在一行中输出两个 PAT 数之和。

输入样例:

30527
06203
415

输出样例:

7201
  
  题解:这道题就是模拟进制转换,需要注意最后一个测试点,不是0+0而是0000+00000这种情况,特判的时候需要注意一下,因为这个卡我19分卡了好久。

代码如下:
 1 #include<iostream>
 2 #include<string>
 3 #include<stack>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     stack<int> d;
 9     int temp = 0, temp2;
10     bool flag = false, flag2 = false;
11     string a, b, c;
12     cin>>a>>b>>c;
13     while( b.length() > c.length()){
14         c = '0'+c; 
15     }
16     while( c.length() > b.length()){
17         b = '0'+b;
18     }
19     for( int i = b.length()-1; i >= 0; i--){
20         if(a[i]=='0')
21             temp2 = 10;
22         else
23             temp2 = a[i] - '0';
24         if(b[i]-'0'+c[i] - '0'+temp >= temp2){
25             d.push(b[i]-'0'+c[i] - '0'+temp - temp2);
26             temp = 1;
27         }
28         else{
29             d.push(b[i]-'0'+c[i]-'0'+temp);
30             temp = 0;
31         }
32     }
33     if( temp == 1)
34         d.push(1);
35     while(!d.empty()){
36         temp = d.top();
37         d.pop();
38         if(!flag){
39             if(temp != 0)
40                 flag = true;
41             else
42                 continue;
43         }  
44         printf("%d",temp);
45     }
46     for( int i = 0; i < b.length(); i++){
47         if(b[i] != '0'||c[i] != '0'){
48             flag2 = true;
49             break;
50         }
51     }
52     if(!flag2) printf("0");
53     return 0;
54 }

 


posted on 2018-08-14 10:41  朋酱  阅读(96)  评论(0编辑  收藏  举报