給定兩個整數 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)範圍內,**無需實現大整數加法**,只需將帶逗號字符串「清洗」為標準整數字面量,再交由語言內建運算即可。
num = num * 10 + (ch - '0') 累積cout << a + b#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++ 風格 |
若題目擴展至任意長度(如 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
核心洞見: 題目看似考察大整數或複雜解析,實則考察**輸入格式清洗能力**與**語言標準庫善用程度**。工程中「數據清洗 → 標準化處理 → 業務邏輯」是普遍模式,切勿過度設計。