首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

HDU 1047 Integer Inquiry:大整數加法 C++ 實作詳解

     編輯:關於C

題目大意

讀入多組大整數(每組以單一 0 結束,整組測資以 T 表示組數),輸出每組數字之和。數字長度可達 200 位,需自行實作高精度加法。

資料結構設計

struct BigNumber {
    int data[200];  // 低位在前:data[0] 為個位
    int len;        // 有效位數
    BigNumber() : len(1) { memset(data, 0, sizeof(data)); }
    BigNumber(char *s) { *this = s; }
    BigNumber& operator=(char *s);
    BigNumber operator+(BigNumber& a);
    void clearLeadZero();
    void print();
};

關鍵函式實作

字串賦值(注意 memset 清零)

BigNumber& BigNumber::operator=(char *str) {
    memset(data, 0, sizeof(data));  // 關鍵:清除舊資料殘留
    len = strlen(str);
    for (int i = 0; i < len; ++i)
        data[i] = str[len - 1 - i] - '0';
    return *this;
}

高精度加法

BigNumber BigNumber::operator+(BigNumber& a) {
    BigNumber z;
    int carry = 0, i = 0, j = 0;
    for (; carry || i < len || j < a.len; ++i, ++j) {
        int sum = data[i] + a.data[j] + carry;
        z.data[i] = sum % 10;
        carry = sum / 10;
    }
    z.len = i;
    z.clearLeadZero();
    return z;
}

移除前導零

void BigNumber::clearLeadZero() {
    while (len > 1 && !data[len - 1]) --len;
}

主程式流程

int main() {
    int T; scanf("%d", &T);
    while (T--) {
        BigNumber ans = "0";
        char s[200];
        while (scanf("%s", s) != EOF) {
            if (s[0] == '0' && s[1] == '\0') break;
            ans = ans + BigNumber(s);
        }
        ans.print();
        if (T) puts("");  // 組別間空行
    }
    return 0;
}

易錯點提醒

  • 字串賦值必須 memset 清零,否則殘留舊資料導致錯誤。
  • 加法迴圈條件 carry || i < len || j < a.len 確保進位不遺漏。
  • 輸出格式:每組結果後換行,組別間多一空行(題目要求)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved