题目
Description
相信大家都做过A+B问题,这个问题简直太简单了,以至于所有的程序员都会做这个题目。
有一天,萌萌哒YZK学姐写了很久很久的代码,以至于在半睡半醒状态看到了恶魔。
恶魔说:愚蠢的程序员啊,不要再做无谓的挣扎了,你再怎么写代码,也改变不了这个世界终将被我统治的结局。
YZK学姐顿时觉得自己被侵犯了,为了程序员的尊严,她要求与恶魔进行决斗,决斗的形式就是写代码。
恶魔给出了一个非常复杂的A+B问题,对于两个长度小于1000的26进制数,它们相加的结果是什么呢?
两人谁先解决这个问题谁就获胜,你能帮助YZK学姐战胜恶魔吗?Input
第一行一个整数T,代表测试数据组数,0<T<25。
之后T行,每行两个长度不大于1000的字符串,仅包含a~z和小数点,a~z分别代表数字0~25。Output
相加的结果,不能包含前后导零(即a)。
Sample Input
2
b b
b.b a.cSample Output
c
b.d
题解
可怕的模拟题
小数加减首先要以小数点为中心进行对齐操作
然后考虑进位
然后就是前导0和后导0的删除
细节非常多,测试数据时,要分别考虑:
- 整数部分(不)进位
- 小数部分(不)进位
- 整数部分(不)为0
- 小数部分(不)为0
- 有(无)前导0
- 有(无)后导0
这些情况的各种组合情况
遇到这种题,不用太慌张,写出代码后,写出各种测试数据,逐步调试来调试出正确的代码
给出一些输入和输出数据
输入
10
z b
a.z a.c
aaab b
a.a a.a
a b.o
b a.b
a.zzzzaa a.aab
z.z b. b
输出
ba
b.b
c
a
b.o
b.b
b.aaaz
bb
c.c
c.c
代码
/* By:OhYee Github:OhYee HomePage:http://www.oyohyee.com Email:oyohyee@oyohyee.com かしこいかわいい? エリーチカ! 要写出来Хорошо的代码哦~ */ #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <vector> #include <list> #include <set> #include <queue> #include <stack> #include <map> using namespace std; const int maxn = 1005; char a_a[maxn]; char a_b[maxn]; char b_a[maxn]; char b_b[maxn]; char temp[2 * maxn]; void Do() { memset(a_a,0,sizeof(a_a)); memset(a_b,0,sizeof(a_b)); memset(b_a,0,sizeof(b_a)); memset(b_b,0,sizeof(b_b)); scanf("%s",temp); sscanf(temp,"%[a-z].%[a-z]",a_a,a_b); scanf("%s",temp); sscanf(temp,"%[a-z].%[a-z]",b_a,b_b); int xs = max(strlen(a_b),strlen(b_b)); int zs = max(strlen(a_a),strlen(b_a)); int size_a_a = strlen(a_a); int size_a_b = strlen(a_b); int size_b_a = strlen(b_a); int size_b_b = strlen(b_b); for(int i = 0;i < size_a_a;i++) a_a[i] -= 'a'; for(int i = 0;i < size_a_b;i++) a_b[i] -= 'a'; for(int i = 0;i < size_b_a;i++) b_a[i] -= 'a'; for(int i = 0;i < size_b_b;i++) b_b[i] -= 'a'; if(zs != size_a_a) { int i; for(i = zs - 1;i >= zs - size_a_a;i--) a_a[i] = a_a[i - zs + size_a_a]; for(;i >= 0;i--) a_a[i] = 0; } if(zs != size_b_a) { int i; for(i = zs - 1;i >= zs - size_b_a;i--) b_a[i] = b_a[i - zs + size_b_a]; for(;i >= 0;i--) b_a[i] = 0; } int jw = false; for(int i = xs - 1;i >= 0;i--) { a_b[i] += b_b[i] + jw; jw = false; if(a_b[i] >= 26) { a_b[i] %= 26; jw = true; } } for(int i = zs - 1;i >= 0;i--) { a_a[i] += b_a[i] + jw; jw = false; if(a_a[i] >= 26) { a_a[i] %= 26; jw = true; } } int zs_b = -1; for(int i = 0;i < zs;i++) { if(a_a[i] != 0) { zs_b = i; break; } } int xs_e = -1; for(int i = xs - 1;i >= 0;i--) { if(a_b[i] != 0) { xs_e = i; break; } } if(jw == false) { if(zs_b == -1) { putchar('a'); } else { for(int i = zs_b;i < zs;i++) putchar(a_a[i] + 'a'); } } else { putchar('b'); for(int i = 0;i < zs;i++) putchar(a_a[i] + 'a'); } if(xs_e != -1) { putchar('.'); for(int i = 0;i <= xs_e;i++) putchar(a_b[i] + 'a'); } putchar('\n'); } int main() { int T; scanf("%d",&T); while(T--) Do(); return 0; }