計算機基本數據類型範圍有限(long long 約 10^18),需實現支持 500 位十進制整數的加減法運算。採用字符串存儲,模擬豎式計算。
while (a[0] == '0') a++; // 移動指針跳過前導零
while (b[0] == '0') b++;
// 全零特殊處理
if (strlen(a) == 0) { a = "0"; }
if (strlen(b) == 0) { b = "0"; }
// 逆序存儲:a[i] 對應數組索引 len-1-i
for (i = 0; i < lena; i++) aa[i] = a[lena-1-i] - '0'; // 或 -48
for (i = 0; i < maxlen; i++) {
cc[i] += aa[i] + bb[i];
if (cc[i] > 9) {
cc[i+1]++; // 進位
cc[i] -= 10; // 當前位修正
}
}
if (cc[maxlen] > 0) maxlen++; // 最高位進位
// 確保大減小:比較字符串大小
int cmp = strcmp(a, b);
if (cmp < 0) { swap(a,b); flag = 1; } // 結果為負
for (i = 0; i < maxlen; i++) {
cc[i] += aa[i] - bb[i];
if (cc[i] < 0) {
cc[i+1]--; // 借位
cc[i] += 10; // 當前位修正
}
}
// 去除結果高位零
while (maxlen > 0 && cc[maxlen-1] == 0) maxlen--;
// 數組逆序轉字符串
for (i = 0; i < len; i++) c[i] = cc[len-1-i] + '0';
c[len] = '\0'; // 必須添加結束符防止亂碼
// 負號處理
if (flag) { // 結果為負
// 向右移動字符騰出位置
for (i = len; i >= 0; i--) c[i+1] = c[i];
c[0] = '-';
len++;
}
void plus(char *a, char *b, char *c) {
int aa[505]={0}, bb[505]={0}, cc[505]={0};
int lena, lenb, len, i, j;
// 去前導零
while (*a == '0') a++;
while (*b == '0') b++;
lena = strlen(a); lenb = strlen(b);
if (lena == 0) { aa[0]=0; lena=1; }
if (lenb == 0) { bb[0]=0; lenb=1; }
len = (lena > lenb) ? lena : lenb;
for (i=0; i 9) { cc[i+1]++; cc[i] -= 10; }
}
if (cc[len] > 0) len++;
for (j=0; j 0 && cc[len-1] == 0) len--;
if (len == 0) len = 1; // 結果為 0
for (j=0; j=0; i--) c[i+1] = c[i];
c[0] = '-'; len++;
}
c[len] = '\0';
}
輸入:
1+2
3-2
輸出:
3
1
BigInt 類,重載 +/- 運算符std::vector 動態擴容替代固定數組