讀入兩個超出 long long 範圍的大整數(如 100 位),以字符串形式存儲,計算其和並輸出。
carry。#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)) |
| 輸出 | 從高位向低位打印,跳過前導零(最高位非零) |
BigInt 結構體,重載運算符(C++ 更適合)。GMP (C)、Boost.Multiprecision (C++)、Java BigInteger、Python int 原生支持。掌握「字符串存儲 + 逐位運算 + 進位傳遞」模式,即可在無大整數庫的環境下實現任意精度計算。