地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 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
注意三点:
1.不能再用传统的-号去解决进位问题,因为8+8相对于2进制进位太多,所以改用/号
2.注意结果为0的情况(最后一个case)
3.注意首多位为0的情况(如测试样例)
1 #include<iostream> 2 #include<string> 3 #include<stack> 4 5 using namespace std; 6 7 char getResult(char ch1, char ch2, char ch3, int &flag) 8 { 9 char result; 10 int temp = 0; 11 12 if (ch1 == '0') 13 temp = 10; 14 15 if (ch2 + ch3 + flag >= ch1 + temp + 48) 16 { 17 result = ch2 + ch3 + flag - ch1 - temp; 18 flag = (ch2+ch3+flag-96)/(ch1+temp-48); 19 } 20 else 21 { 22 result = ch2 + ch3 + flag - 48; 23 flag = 0; 24 } 25 26 return result; 27 } 28 29 int main() 30 { 31 string str1, str2, str3; 32 stack<char> s; 33 int flag = 0; 34 35 getline(cin, str1); 36 getline(cin, str2); 37 getline(cin, str3); 38 39 int str1Len = str1.size() - 1; 40 int str2Len = str2.size() - 1; 41 int str3Len = str3.size() - 1; 42 43 for (; str2Len >= 0 || str3Len >= 0; --str1Len, --str2Len, --str3Len) 44 { 45 if (str2Len < 0) 46 s.push(getResult(str1[str1Len], '0', str3[str3Len], flag)); 47 else if (str3Len < 0) 48 s.push(getResult(str1[str1Len], str2[str2Len], '0', flag)); 49 else 50 s.push(getResult(str1[str1Len], str2[str2Len], str3[str3Len], flag)); 51 } 52 53 if (flag != 0)//如果flag不为0,则代表有新的进位 54 s.push(flag + 48); 55 56 while (!s.empty() && s.top() == '0')//去除首位的0 57 s.pop(); 58 59 if(s.empty())//如果全为0则为0 60 cout<<0<<endl; 61 62 while (!s.empty()) 63 { 64 cout << s.top(); 65 s.pop(); 66 } 67 68 return 0; 69 }