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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM