標準整數型別(int/long)範圍有限。大數運算將數字拆解為位元組/十進位陣列,模擬手算過程實現任意精度運算。
5 0 3 7 (被乘數,低位在右)
× 4 8 (乘數)
----------
4 0 2 9 6 (×8)
2 0 1 4 8 0 (×40,左移一位)
----------
2 4 1 7 7 6
arr[99] 為個位,arr[98] 為十位...(低位在高索引)using System;
namespace 大數 {
class Program {
static void Main(string[] args) {
int[] arr = new int[100];
// 初始化:5037 存為 ... 5,0,3,7 (arr[96]=5, arr[97]=0, arr[98]=3, arr[99]=7)
arr[99] = 5; // 這裡範例似乎有誤,應為 7
arr[98] = 0;
arr[97] = 3;
arr[96] = 7;
// 正確應為:arr[99]=7, arr[98]=3, arr[97]=0, arr[96]=5 代表 5037
Opration(arr, 48);
for (int i = 0; i < arr.Length; i++)
Console.Write(arr[i]);
Console.ReadKey();
}
static int[] Opration(int[] arr, int num) {
// 步驟 1:每位乘以 num
for (int i = 0; i < arr.Length; i++) {
arr[i] *= num;
}
// 步驟 2:從低位向高位處理進位
for (int i = arr.Length - 1; i > 0; i--) {
arr[i - 1] += arr[i] / 10; // 進位給高位
arr[i] = arr[i] % 10; // 保留當前位
}
return arr;
}
}
}
數字 5037 → arr[96]=5, arr[97]=0, arr[98]=3, arr[99]=7 (高位在低索引)
static List Multiply(List num1, List num2) {
// num1, num2 低位在前 (index 0 = 個位)
List result = new List(new int[num1.Count + num2.Count]);
for (int i = 0; i < num1.Count; i++) {
int carry = 0;
for (int j = 0; j < num2.Count; j++) {
int mul = num1[i] * num2[j] + result[i+j] + carry;
result[i+j] = mul % 10;
carry = mul / 10;
}
result[i + num2.Count] = carry;
}
// 移除前導零
while (result.Count > 1 && result[result.Count-1] == 0)
result.RemoveAt(result.Count-1);
return result;
}
| 運算 | 核心思想 | 複雜度 |
|---|---|---|
| 加法 | 逐位相加 + 進位 | O(n) |
| 減法 | 逐位相減 + 借位 | O(n) |
| 乘法 | 模擬豎式 / FFT (極大數) | O(n²) / O(n log n) |
| 除法 | 試商法 / 牛頓迭代 | O(n²) / O(n log n) |
| 模冪 | 快速冪 + 模運算 | O(log n × M(n)) |
理解大數運算底層邏輯,有助於在無內建支援環境下實作,也能更深入理解電腦如何處理超越硬體位寬的數值。