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

算法題精講:帶逗號分隔的大整數加法 (A+B 問題進階版)

     編輯:關於C語言

題目描述

給定兩個整數 A 和 B,其表示形式特殊:**從個位開始,每三位用逗號 `,` 分隔**(如 `-234,567,890`)。要求計算 A + B 並以**正常整數形式**(無逗號、無前導零)輸出。

輸入輸出規範

  • 輸入:多組測試數據,每行兩個帶逗號整數 A B(-10^9 < A,B < 10^9)
  • 輸出:每行一個結果,正常整數格式
  • 樣例:
    輸入:
    -234,567,890 123,456,789
    1,234 2,345,678
    
    輸出:
    -111111101
    2346912
    

核心思路:字符串預處理 + 標準整數運算

由於數值範圍在 long long(int64_t)範圍內,**無需實現大整數加法**,只需將帶逗號字符串「清洗」為標準整數字面量,再交由語言內建運算即可。

關鍵步驟

  1. 移除逗號:遍歷字符串,跳過 `,` 字符
  2. 處理負號:記錄首字符是否為 `-`,解析時忽略它,最後乘以符號係數
  3. 字符轉數值:num = num * 10 + (ch - '0') 累積
  4. 相加輸出:直接 cout << a + b

參考代碼(C++ 標準庫風格)

#include 
#include 
#include  // for isdigit

using namespace std;

// 將帶逗號字符串解析為 long long
long long parseCommaNumber(const string& s)
{
    long long val = 0;
    int sign = 1;
    bool started = false; // 是否已遇到第一個數字(用於跳過前導符號/逗號)

    for (char ch : s)
    {
        if (!started)
        {
            if (ch == '-') { sign = -1; started = true; continue; }
            if (ch == '+') { started = true; continue; }
            if (ch == ',') continue; // 允許開頭有逗號(雖然題目不會)
        }

        if (isdigit(ch))
        {
            val = val * 10 + (ch - '0');
            started = true;
        }
        // 忽略逗號和其他非數字字符
    }
    return val * sign;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string a, b;
    while (cin >> a >> b)
    {
        long long x = parseCommaNumber(a);
        long long y = parseCommaNumber(b);
        cout << x + y << '\n';
    }
    return 0;
}

原始代碼優化點分析

原代碼特徵改進方向收益
手動索引循環 for(int i=0; i<l; i++)範圍-based for for(char ch : s)代碼更簡潔,避免越界風險
重複解析邏輯(兩個獨立循環)提取函數 parseCommaNumber消除重複,便於測試與維護
未使用 isdigit,直接 ch-'0'增加 isdigit 守衛防禦性編程,忽略非預期字符
未關閉同步 sync_with_stdio(false)添加 IO 加速大數據量下輸入輸出速度提升 5-10 倍
固定緩衝區 char c[20] 風險使用 std::string 自動管理內存安全、無長度限制、現代 C++ 風格

擴展挑戰:若數值超出 64 位怎麼辦?

若題目擴展至任意長度(如 1000 位),需實現**大整數加法**:

// 大整數加法核心邏輯(字符串模擬豎式加法)
string addBigInt(string a, string b)
{
    // 1. 移除逗號、對齊符號、判斷正負、決定加/減
    // 2. 反轉字符串,從低位向高位逐位相加,處理進位
    // 3. 結果反轉,去除前導零,添加符號
    // ... 完整實現約 50-80 行
}

但本題範圍內,long long 完全足夠,**簡單即是美**。

複雜度分析

  • 時間複雜度:O(N),N 為輸入字符串總長度(單次遍歷解析)
  • 空間複雜度:O(1) 額外空間(不計輸入輸出字符串)

測試用例自查

輸入:
0 0
-1,000 1,000
123,456 0
-0 -0
999,999,999 1

預期輸出:
0
0
123456
0
1000000000

核心洞見: 題目看似考察大整數或複雜解析,實則考察**輸入格式清洗能力**與**語言標準庫善用程度**。工程中「數據清洗 → 標準化處理 → 業務邏輯」是普遍模式,切勿過度設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved