以字元陣列或 StringBuilder 儲存每一位數字,模擬手算邏輯實作加減乘除。
static internal class Calculate
{
static private int[] _operand1;
static private int[] _operand2;
static private IList<int> _result;
// 共用前置處理
static private void SetOperand(StringBuilder a, StringBuilder b) { ... }
static private void Reverse() { ... } // 反轉陣列便於個位對齊
static private StringBuilder GetResult() { ... }
}
static internal StringBuilder Addition(StringBuilder a, StringBuilder b)
{
SetOperand(a, b);
Reverse();
int len = Math.Max(_operand1.Length, _operand2.Length);
int carry = 0;
for (int i = 0; i < len; i++)
{
int n1 = i < _operand1.Length ? _operand1[i] : 0;
int n2 = i < _operand2.Length ? _operand2[i] : 0;
int sum = n1 + n2 + carry;
_result.Insert(0, sum % 10);
carry = sum / 10;
}
if (carry > 0) _result.Insert(0, carry);
return GetResult();
}
static internal StringBuilder Subtraction(StringBuilder a, StringBuilder b)
{
SetOperand(a, b);
Reverse();
bool aLarger = CompareAbs(a, b) >= 0;
int[] big = aLarger ? _operand1 : _operand2;
int[] small = aLarger ? _operand2 : _operand1;
int borrow = 0;
for (int i = 0; i < big.Length; i++)
{
int diff = big[i] - (i < small.Length ? small[i] : 0) - borrow;
if (diff < 0) { diff += 10; borrow = 1; } else borrow = 0;
_result.Insert(0, diff);
}
// 移除前導零
while (_result.Count > 1 && (int)_result[0] == 0) _result.RemoveAt(0);
return aLarger ? GetResult() : new StringBuilder("-").Append(GetResult());
}
static internal StringBuilder Multiplication(StringBuilder a, StringBuilder b)
{
SetOperand(a, b);
Reverse();
var total = new List<int>();
for (int i = 0; i < _operand2.Length; i++)
{
int carry = 0;
var row = new List<int>();
// 補齊位權零
for (int k = 0; k < i; k++) row.Add(0);
for (int j = 0; j < _operand1.Length; j++)
{
int prod = _operand1[j] * _operand2[i] + carry;
row.Add(prod % 10);
carry = prod / 10;
}
if (carry > 0) row.Add(carry);
total = AddLists(total, row); // 重用加法邏輯
}
_result = total;
return GetResult();
}
var a = new StringBuilder("12345678901234567890");
var b = new StringBuilder("987654321");
Console.WriteLine(Calculate.Addition(a, b));
Console.WriteLine(Calculate.Multiplication(a, b));
List<int> 避免 Insert(0,…) 的 O(n) 位移。System.Numerics.BigInteger(.NET 4.0+)。