链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1624
描述:
ikki有一沓标有大写英文字母的卡片,但是奇怪的是里面只有标从’A’-‘T’的卡片,ikki用这20种卡片设计了一个
小游戏:用’A’-‘T’分别表示数字 0 – 19,ikki把这些卡片表示的字母看成是20进制数,并用卡片拼成了两个数
字,现在ikki想让你用卡片表示出这两个数字相加之后的结果(卡片数量不限)。例如:拼成两个20进制数
分别是AAAADH,BCE 可以这样得到结果:
a = 0 * 20^5+0* 20^4+ 0* 20^3+ 0 *20^2 + 3*20 + 7 = 67
多组测试数据。
每组测试数据输入两个只包含大写字母’A’-‘T’的字符串,表示两个20进制数,字符串长度均小于200。
对于每组测试数据输出一个用卡片表示的两个20进制数的和,每组输出占一行。AAA C
AAADH BCE
Output:
C
BFL
好久都没有敲大数加法的代码了,生疏了超多,做这道题的时候错误真不是一般的多,而且检查的难度不是一般的高,建议广大计算机小童鞋,这种大数的代码没事敲多几次,这样在临时要的时候不至于拿着那种烂模板照着敲,要不然到时真不知道哪里出错了,改又不知道怎么改,这才是最让人头疼的、、、
测试数据了N次,,终于过了,,一开始是T B的时候测不到,然后以为对了,没想到还是错了,
这里再提示几组测试数据吧,AAAA AA --> A TT B --> BAA T B --> BA
看一下我写的猥琐代码吧,别吐口水哈各位靓仔靓女,别弄脏自己的电脑:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 256 #define RST(N)memset(N, 0, sizeof(N)) using namespace std; char str1[MAXN], str2[MAXN], ans[MAXN]; int a[MAXN], b[MAXN], d[MAXN], top; void ADD(int a[], int b[]) { int cnt = 0; for(int i=0; i<MAXN; i++) { int temp = d[i]+a[i]+b[i]; //d存储最后的结果,各位大神肯定看得懂; d[i] = temp%20; if(temp >= 20) d[i+1]++; //进位,这个函数修改的最多,真是有点浪费青春; } } int main() { while(~scanf("%s %s", str1, str2)) { RST(ans), RST(a), RST(b), RST(d); int L1 = strlen(str1), L2 = strlen(str2); int k1 = 0, k2 = 0; for(int i=L1-1; i>=0; i--) a[k1++] = (int)str1[i] - 'A'; //换成数字存储; for(int i=L2-1; i>=0; i--) b[k2++] = (int)str2[i] - 'A'; ADD(a, b); int flag = 0; //标记输出; for(int i=MAXN-1; i>=0; i--) { if(flag) { printf("%c", (char)(d[i]+'A')); continue; }else if(d[i]) { printf("%c", (char)(d[i]+'A')); flag = 1; } } if(flag == 0) puts("A"); //0+0的情况,也就是全是A相加的情况; puts(""); //换行 } return 0; }