在 32 位元 CPU 架構下,int 型別僅能表示約 42 億(2³²-1)以內的整數;即便升級至 64 位元,雖然範圍大幅擴展,但終究有上限。當應用場景需要處理超出硬體原生支援範圍的超大整數時,我們必須自行實作大數運算邏輯。
回顧人工進行多位數加減乘除的步驟,不外乎三大基石:
將這些規則轉化為程式邏輯,即可構建任意精度的整數運算庫。以加法為例,採用「先逐位相加、再統一處理進位」的策略,能顯著簡化程式碼結構。
int* big_int_add(int src1[], int len1, int src2[], int len2) {
if (!src1 || len1 <= 0 || !src2 || len2 <= 0) return NULL;
int max_len = (len1 > len2 ? len1 : len2) + 1; // 預留進位空間
int* dest = (int*)malloc(sizeof(int) * max_len);
assert(dest != NULL);
memset(dest, 0, sizeof(int) * max_len);
int min_len = (len1 < len2) ? len1 : len2;
int i = 0;
// 1. 對應位逐位相加(暫不處理進位)
for (; i < min_len; ++i)
dest[i] = src1[i] + src2[i];
// 2. 處理較長數值的剩餘位
if (len1 > len2) {
for (; i < len1; ++i) dest[i] = src1[i];
} else {
for (; i < len2; ++i) dest[i] = src2[i];
}
// 3. 統一進行十進位進位處理
int carry = 0;
for (i = 0; i < max_len; ++i) {
dest[i] += carry;
carry = dest[i] / 10;
dest[i] %= 10;
}
return dest; // 呼叫端需自行 free
}
此演算法最大特色在於將「計算」與「進位」分離:先完成所有位的原始相加,最後再掃描一次處理進位。這種設計降低了邏輯耦合,也方便擴展至減法、乘法、除法。
思考練習:
掌握大數加法後,你已踏入任意精度運算的大門。後續文章將逐步展開減、乘、除及更高階演算法的實作細節。