HFUT 1362.恶魔a+b(安徽省2016“京胜杯”程序设计大赛 I)

382

题目



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.c


Sample 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;
}
发布评论
  • 点击查看/关闭被识别为广告的评论