代碼核心問題
- 語法錯誤:函數參數缺少逗號、缺少分號、循環條件不完整
- 邏輯錯誤:字符數組與數值混淆、進位處理錯誤、索引越界
- 設計缺陷:函數嵌套定義(C 不支持)、未處理負數/小數點對齊
修正版大數加法(整數)
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
// 字符串反轉
void reverse(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char tmp = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = tmp;
}
}
// 大數加法:result = num1 + num2
void bigAdd(const char *num1, const char *num2, char *result) {
char n1[MAX_LEN], n2[MAX_LEN];
strcpy(n1, num1);
strcpy(n2, num2);
reverse(n1);
reverse(n2);
int len1 = strlen(n1);
int len2 = strlen(n2);
int maxLen = len1 > len2 ? len1 : len2;
int carry = 0;
for (int i = 0; i < maxLen || carry; i++) {
int d1 = i < len1 ? n1[i] - '0' : 0;
int d2 = i < len2 ? n2[i] - '0' : 0;
int sum = d1 + d2 + carry;
result[i] = (sum % 10) + '0';
carry = sum / 10;
}
result[maxLen + (carry ? 1 : 0)] = '\0';
reverse(result);
}
int main() {
char a[MAX_LEN], b[MAX_LEN], res[MAX_LEN + 1];
printf("輸入第一個大整數: ");
scanf("%s", a);
printf("輸入第二個大整數: ");
scanf("%s", b);
bigAdd(a, b, res);
printf("和: %s\n", res);
return 0;
}
擴展:支持小數
- 分離整數部分與小數部分
- 小數部分補齊等長(右側補 0)
- 分別加法,處理小數進位到整數
- 合併結果,去除尾部多餘 0
關鍵數據結構建議
typedef struct {
int digits[MAX_LEN]; // 每位存一位數字,低位在前
int len; // 有效位數
int decimalPos; // 小數點位置(從右向左第幾位)
} BigNum;
學習建議
- 先實現整數加法,再擴展減法、乘法、除法
- 參考開源大數庫:GMP、LibTomMath
- 理解「分治」思想:將大問題分解為單位運算
- 大量測試邊界:前導零、最大長度、進位鏈、負數