首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

大數計算:突破整數位寬限制的 C 語言實作

     編輯:關於C

在 32 位元 CPU 架構下,int 型別僅能表示約 42 億(2³²-1)以內的整數;即便升級至 64 位元,雖然範圍大幅擴展,但終究有上限。當應用場景需要處理超出硬體原生支援範圍的超大整數時,我們必須自行實作大數運算邏輯。

核心思路:模擬手算過程

回顧人工進行多位數加減乘除的步驟,不外乎三大基石:

  1. 熟記 9×9 乘法口訣(單位運算表)
  2. 掌握個位數之間的加減法與進位/借位規則
  3. 將乘法拆解為重複加法與左移,除法拆解為重複減法與右移

將這些規則轉化為程式邏輯,即可構建任意精度的整數運算庫。以加法為例,採用「先逐位相加、再統一處理進位」的策略,能顯著簡化程式碼結構。

大整數加法 C 語言實作

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
}

演算法特點與延伸思考

此演算法最大特色在於將「計算」與「進位」分離:先完成所有位的原始相加,最後再掃描一次處理進位。這種設計降低了邏輯耦合,也方便擴展至減法、乘法、除法。

思考練習:

  • 減法如何實作?(提示:需引入借位機制,注意被減數是否足夠大)
  • 乘法可如何利用「加法+左移」特性實現?
  • 除法又該如何透過「減法+右移」完成?

掌握大數加法後,你已踏入任意精度運算的大門。後續文章將逐步展開減、乘、除及更高階演算法的實作細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved