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

高精度加減法實現:突破數據類型限制的大整數運算核心算法

     編輯:C 語言入門

問題背景

計算機基本數據類型範圍有限(long long 約 10^18),需實現支持 500 位十進制整數的加減法運算。採用字符串存儲,模擬豎式計算。

核心思路:字符串→逆序數組→模擬豎式→結果字符串

  1. 去除前導零
  2. 字符串逆序轉為整型數組(個位在索引 0)
  3. 按位運算 + 進位/借位處理
  4. 結果逆序轉回字符串

關鍵技術細節

前導零處理

while (a[0] == '0') a++;  // 移動指針跳過前導零
while (b[0] == '0') b++;
// 全零特殊處理
if (strlen(a) == 0) { a = "0"; }
if (strlen(b) == 0) { b = "0"; }

字符轉數字

// 逆序存儲:a[i] 對應數組索引 len-1-i
for (i = 0; i < lena; i++) aa[i] = a[lena-1-i] - '0';  // 或 -48

加法進位邏輯

for (i = 0; i < maxlen; i++) {
    cc[i] += aa[i] + bb[i];
    if (cc[i] > 9) {
        cc[i+1]++;      // 進位
        cc[i] -= 10;    // 當前位修正
    }
}
if (cc[maxlen] > 0) maxlen++;  // 最高位進位

減法借位邏輯

// 確保大減小:比較字符串大小
int cmp = strcmp(a, b);
if (cmp < 0) { swap(a,b); flag = 1; }  // 結果為負

for (i = 0; i < maxlen; i++) {
    cc[i] += aa[i] - bb[i];
    if (cc[i] < 0) {
        cc[i+1]--;      // 借位
        cc[i] += 10;    // 當前位修正
    }
}
// 去除結果高位零
while (maxlen > 0 && cc[maxlen-1] == 0) maxlen--;

結果輸出

// 數組逆序轉字符串
for (i = 0; i < len; i++) c[i] = cc[len-1-i] + '0';
c[len] = '\0';  // 必須添加結束符防止亂碼

// 負號處理
if (flag) {  // 結果為負
    // 向右移動字符騰出位置
    for (i = len; i >= 0; i--) c[i+1] = c[i];
    c[0] = '-';
    len++;
}

完整函數實現

void plus(char *a, char *b, char *c) {
    int aa[505]={0}, bb[505]={0}, cc[505]={0};
    int lena, lenb, len, i, j;
    
    // 去前導零
    while (*a == '0') a++;
    while (*b == '0') b++;
    lena = strlen(a); lenb = strlen(b);
    if (lena == 0) { aa[0]=0; lena=1; }
    if (lenb == 0) { bb[0]=0; lenb=1; }
    
    len = (lena > lenb) ? lena : lenb;
    for (i=0; i 9) { cc[i+1]++; cc[i] -= 10; }
    }
    if (cc[len] > 0) len++;
    
    for (j=0; j 0 && cc[len-1] == 0) len--;
    if (len == 0) len = 1;  // 結果為 0
    
    for (j=0; j=0; i--) c[i+1] = c[i];
        c[0] = '-'; len++;
    }
    c[len] = '\0';
}

測試用例

輸入:
1+2
3-2

輸出:
3
1

工程化建議

  1. 封裝為 BigInt 類,重載 +/- 運算符
  2. 支持乘法(FFT/分治)、除法、模運算
  3. 使用 std::vector 動態擴容替代固定數組
  4. 添加輸入驗證(非數字字符檢查)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved