char a[1001], b[1001] 存儲原始數字串sum[i] = a[i] + b[i] + carry每輪循環必須 memset 或迴圈清零 a2, b2, sum,否則殘留數據導致錯誤 (原作者曾因此調試半小時)。
for (j = la-1, r = 1; j >= 0; j--, r++) a2[r] = a1[j] - '0';
減去 '0' (ASCII 48) 比寫死 48 可讀性強。
for (j = 1; j <= k; j++) {
sum[j] += a2[j] + b2[j];
if (sum[j] >= 10) {
sum[j] -= 10;
sum[j+1]++; // 向高位進位
}
}
注意:最高位進位可能導致結果長度 k+1,輸出前需檢查 sum[k+1]。
#include <stdio.h>
#include <string.h>
#define MAXL 1005
int main() {
int T;
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++) {
char s1[MAXL], s2[MAXL];
int a[MAXL] = {0}, b[MAXL] = {0}, sum[MAXL] = {0};
scanf("%s %s", s1, s2);
int la = strlen(s1), lb = strlen(s2);
// 逆序存儲
for (int i = 0; i < la; i++) a[i+1] = s1[la-1-i] - '0';
for (int i = 0; i < lb; i++) b[i+1] = s2[lb-1-i] - '0';
int k = (la > lb ? la : lb);
// 逐位相加
for (int i = 1; i <= k; i++) {
sum[i] += a[i] + b[i];
if (sum[i] >= 10) {
sum[i] -= 10;
sum[i+1]++;
}
}
if (sum[k+1]) k++; // 處理最高位進位
// 輸出
printf("Case %d:\n", tc);
for (int i = la; i >= 1; i--) putchar(a[i] + '0');
printf(" + ");
for (int i = lb; i >= 1; i--) putchar(b[i] + '0');
printf(" = ");
for (int i = k; i >= 1; i--) putchar(sum[i] + '0');
printf("\n");
if (tc != T) printf("\n");
}
return 0;
}
sum[k+1]if (tc != T) puts("");%s 直接讀字符串,避免 scanf 空白字符困擾C++ 可用 std::string + reverse_iterator 或現成 BigInteger 庫,代碼更簡潔安全。但 ACM 競賽常要求純 C 實現,掌握數組模擬是基本功。
HDU 1002 是「大整數加法」的標準入門題。核心是「字符串存儲、逆序對齊、逐位運算、進位傳遞、逆序輸出」五步曲。細節決定成敗:初始化、邊界、格式。熟練掌握此模板,後續大整數減法、乘法、除法、階乘、斐波那契皆可類推。