1074. 宇宙无敌加法器(20)

原题: https://www.patest.cn/contests/pat-b-practise/1074

思路: 就是人工模拟加法的问题, 正常进制都是10, 现在就是进制从字符串中
读取. 但有些情况要坐下特殊处理, 比如输入的两个数可能位数不一样, 这对
我们后续计算造成不小的麻烦, 我的做法是强制补前导0, 使输入完全一致.
另外需要注意两个3位数相加可能得到4位数, 所以结果字符串要开大一些. 题目
中给的数字范围都没什么暖用, 比如题目中说了输入的两个数是正的, 但结果测试
仍然会检查输出为0的情况, 试问两个正数相加怎么能得0呢, 但是我们实现的算法
不管有没有0, 都能正常工作.

题目中有个数字是有用的, 那就是数字的位数为20位, 这就要求在后续打印数字的
时候不能采用sscanf进行字符串转数字. 只能采用传统的方法使用getchar一步
打印

测试点3和测试点4测试的是数非常大的情况, 比如20位
测试点5测试的是输出0的情况

实现:

#include <stdio.h>
#include <string.h>
#define LEN 30

int main (void) {
    char table[LEN];
    int len;
    char num1[LEN];
    char num2[LEN];
    char res[LEN];
    char tmp1[LEN];
    char tmp2[LEN];
    int i;
    int j;

    table[0] = '0';
    scanf("%s", table + 1);
    scanf("%s", tmp1);
    scanf("%s", tmp2);
    len = strlen(table);
    for (i = 0; i < len; i++) {
        num1[i] = '0';
        num2[i] = '0';
        res[i] = '0';
    }
    i = len - 1;
    for (j = strlen(tmp1) - 1; j >= 0; j--) num1[i--] = tmp1[j];
    num1[len] = '\0'; // 这个不能少
    i = len - 1;
    for (j = strlen(tmp2) - 1; j >= 0; j--) num2[i--] = tmp2[j];
    num2[len] = '\0';

    int now;
    int carry = 0; // 进位
    int sys;       // 进制
    for (i = len - 1; i >= 0; i--) {
        if (table[i] == '0') {
            sys = 10;
        } else {
            sys = table[i] - '0';
        }
        now = (num1[i] - '0') + (num2[i] - '0') + carry;
        if (now < sys) {
            res[i] = now + '0';
            carry = 0;
        } else {
            carry = 1;
            res[i] = now - sys + '0';
        }
    }
    res[len] = '\0'; // 这行也可以不需要

    for (i = 0; i < len; i++) {
        if (res[i] != '0') break;
    }
    if (i == len) {
        printf("0");
    } else {
        for (; i < len; i++) {
            printf("%c", res[i]);
        }
    }

    return 0;
}

posted @ 2017-11-26 10:23  阿胜4K  阅读(1577)  评论(0编辑  收藏  举报