首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言大整數加法:字符串存儲實現任意精度加法

     編輯:程式設計綜合問答

需求

讀入兩個超出 long long 範圍的大整數(如 100 位),以字符串形式存儲,計算其和並輸出。

核心思路:模擬手工豎式加法

  1. 字符串反序或從尾向頭遍歷,逐位相加。
  2. 維護進位 carry。
  3. 結果按低位到高位存入數組/字符串,最後反序輸出。

完整可運行代碼 (C99)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_DIGITS 200  // 支持 200 位

// 字符串轉數字數組(低位在前)
void strToDigits(const char *s, int *digits, int *len) {
    *len = strlen(s);
    for (int i = 0; i < *len; i++) {
        digits[i] = s[*len - 1 - i] - '0'; // 反序存儲
    }
}

// 高精度加法
void addBigInt(const int *a, int lenA, const int *b, int lenB, int *res, int *resLen) {
    int carry = 0;
    int maxLen = lenA > lenB ? lenA : lenB;
    for (int i = 0; i < maxLen || carry; i++) {
        int sum = carry;
        if (i < lenA) sum += a[i];
        if (i < lenB) sum += b[i];
        res[i] = sum % 10;
        carry = sum / 10;
    }
    *resLen = maxLen + (carry ? 1 : 0);
}

// 輸出數字數組(高位在前)
void printDigits(const int *digits, int len) {
    for (int i = len - 1; i >= 0; i--) putchar(digits[i] + '0');
    putchar('\n');
}

int main() {
    char s1[MAX_DIGITS], s2[MAX_DIGITS];
    int a[MAX_DIGITS], b[MAX_DIGITS], res[MAX_DIGITS + 1];
    int lenA, lenB, lenRes;

    printf("輸入第一個大整數: ");
    scanf("%199s", s1);
    printf("輸入第二個大整數: ");
    scanf("%199s", s2);

    strToDigits(s1, a, &lenA);
    strToDigits(s2, b, &lenB);
    addBigInt(a, lenA, b, lenB, res, &lenRes);

    printf("和 = ");
    printDigits(res, lenRes);
    return 0;
}

運行示例

輸入第一個大整數: 999999999999999999999999999999
輸入第二個大整數: 1
和 = 1000000000000000000000000000000

關鍵點解析

環節處理方式
輸入scanf("%s") 讀字符串,避免整型溢出
存儲數組 int digits[],每元素存一位(0-9),低位索引 0
加法單循環處理兩數組對應位 + 進位,時間 O(max(n,m))
輸出從高位向低位打印,跳過前導零(最高位非零)

擴展方向

  • 支持負數:添加符號位,實現減法/比較邏輯。
  • 乘法/除法:模擬豎式乘法(O(n²))或 FFT 加速(O(n log n))。
  • 封裝為庫:定義 BigInt 結構體,重載運算符(C++ 更適合)。
  • 現有成熟庫:GMP (C)、Boost.Multiprecision (C++)、Java BigInteger、Python int 原生支持。

掌握「字符串存儲 + 逐位運算 + 進位傳遞」模式,即可在無大整數庫的環境下實現任意精度計算。

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