7-7 N进制高精度加法 (20分)
到底应该怎样理解进制呢?首先得有“一个”的数量概念,然后就是这样的:
把用来表示数量的符号依次排列,例如: q w e r
然后定义最前面的符号为“零”,即“没有”,后面的符号表示的数量依次比前一个符号多“一个”
进制就这样产生了: 例如当我们数数,依次数到 q w e r ,再往后数一个,符号不够用了,那么就写成 wq
并且,我们把这种进制命名为“wq”进制。
感觉怪异吗? 那么请换成我们熟悉的所谓“10”进制看看:
我们的用于表示数量的符号依次是: 0 1 2 3 4 5 6 7 8 9 , 当数到9,再往后数“一个”时,就数到了 10
看这幅漫画(来源于网络),看看能不能理解“进制”的概念?
现在,给定表示数量的符号(这些符号就形成了某种进制),以及该种进制下的两个不超过100位的正整数,请计算两数之和。
输入格式:
第一行给定表示数量的符号,每个符号为一个字符、各不相同且中间没有空格,最多有30个符号且符号的可能范围是:数字0
-9
、大小写字母、!
、@
、#
、$
、%
、^
、&
、*
、(
、)
接下来两行每行给出一个该进制下的不超过100位的正整数
输出格式:
在一行中输出该进制下的两数之和。
输入样例1:
0123456789 123 12
输出样例1:
135
输入样例2:
abcd
bcd
bc
输出样例2:
cab
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <map> 5 using namespace std; 6 7 int max_len(string s1, string s2) { 8 return s1.length() > s2.length() ? s1.length() : s2.length(); 9 } 10 int main() { 11 string table, ls1, ls2; 12 char res[101]={}; 13 map<char, int> mci; 14 map<int, char> mic; 15 cin >> table; 16 cin >> ls1; 17 cin >> ls2; 18 reverse(ls1.begin(), ls1.end()); 19 reverse(ls2.begin(), ls2.end()); 20 for (int i = 0; i < table.length(); i++) { 21 mci[table[i]] = i; 22 mic[i] = table[i]; 23 } 24 int jinwei = 0,cnt=0; 25 for (int i = 0; i < max_len(ls1, ls2); i++) { 26 if (i < ls1.length() && i < ls2.length()) { 27 int sum = mci[ls1[i]] + mci[ls2[i]] + jinwei; 28 if (sum >= table.length()) { 29 res[i] = mic[sum - table.length()]; 30 jinwei = 1; 31 cnt++; 32 } 33 else { 34 res[i] = mic[sum]; 35 jinwei = 0; 36 cnt++; 37 } 38 } 39 else if (i < ls1.length() && i >= ls2.length()) { 40 int sum = mci[ls1[i]] + jinwei; 41 if (sum >= table.length()) { 42 res[i] = mic[sum - table.length()]; 43 jinwei = 1; 44 cnt++; 45 } 46 else { 47 res[i] = mic[sum]; 48 jinwei = 0; 49 cnt++; 50 } 51 } 52 else 53 { 54 int sum = mci[ls2[i]] + jinwei; 55 if (sum >= table.length()) { 56 res[i] = mic[sum - table.length()]; 57 jinwei = 1; 58 cnt++; 59 } 60 else { 61 res[i] = mic[sum]; 62 jinwei = 0; 63 cnt++; 64 } 65 } 66 } 67 if (jinwei != 0) { 68 res[++cnt] = mic[jinwei]; 69 cnt++; 70 } 71 72 string s=" "; 73 for(int i=cnt;i>=0;i--) 74 if(res[i]) 75 cout<<res[i]; 76 return 0; 77 }