核心思想:字元陣列/位元陣列模擬手算
內建型別 (long long 64 位) 無法直接存儲 128 位整數,需自行實現大整數結構。
資料結構設計
#define MAX_DIGITS 40 // 128 位 ≈ 39 位十進位數字
typedef struct {
int digits[MAX_DIGITS]; // 每元素存 0-9 (或 0-9999 進位制)
int len; // 有效位數
int sign; // 1 正, -1 負
} BigInt;
關鍵運算實現要點
- 加減法:逐位對齊、進位/借位、修正符號。
- 乘法:模擬豎式乘法 O(n²);大規模可用 Karatsuba (O(n^1.585)) 或 FFT (O(n log n))。
- 除法:試商法 (長除法) 或 Newton-Raphson 迭代求倒數再乘。
- 輸入/輸出:字串解析 → 內部表示;內部表示 → 字串列印。
推薦現成庫 (生產環境首選)
| 庫 | 語言 | 特點 |
| GMP (GNU MP) | C | 工業級、極致效能、支援任意精度整數/有理數/浮點 |
| OpenSSL BIGNUM | C | 密碼學優化、廣泛部署 |
| libtommath | C | 單檔頭、易嵌入、公有領域 |
| Boost.Multiprecision | C++ | 頭檔唯、表達式模板、型別安全 |
教學用極簡加法範例 (十進位制)
void big_add(const BigInt *a, const BigInt *b, BigInt *res)
{
int carry = 0, i = 0;
for (; i < a->len || i < b->len || carry; i++) {
int da = i < a->len ? a->digits[i] : 0;
int db = i < b->len ? b->digits[i] : 0;
int sum = da + db + carry;
res->digits[i] = sum % 10;
carry = sum / 10;
}
res->len = i;
}
- 上一篇文章: 2010 年 3 月全國計算機二級 C 語言筆試真題與答案獲取途徑
- 下一篇文章: C語言 switch-case 預設標籤 default 執行順序與穿透行為
Copyright ©
程式碼之家 All Rights Reserved