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 }