首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> C# 入門

C# 實作大整數(無限位數)四則運算核心演算法

     編輯:C# 入門

設計思路

以字元陣列或 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();
}

除法:試商法,結合乘法與減法

  1. 取被除數前段與除數同長度片段。
  2. 嘗試 1~9 倍除數(用乘法),找最大不超過片段的倍數。
  3. 該倍數為商的當前位,片段減去倍數結果帶下下一位繼續。
  4. 重複至被除數用盡。

使用範例

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) 位移。
  • 生產環境可直接使用 .NET 內建 System.Numerics.BigInteger(.NET 4.0+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved