C語言兩個較大數字相加
思路分析
由于C語言中的基本數據類型(如int、long等)有固定的大小,無法直接處理非常大的數字(如數百位的數字)。因此,我們需要采用字符串或數組來表示大數字,并逐位進行加法操作。具體思路如下:
- 輸入處理:將兩個大數字以字符串的形式輸入,并將其反轉,以方便從低位到高位進行逐位相加。
- 逐位相加:從低位到高位逐位相加,同時處理進位問題。如果兩個數字長度不同,則在短數字的高位補0。
- 處理進位:如果最高位有進位,則在結果的最高位補1。
- 結果處理:將結果字符串反轉,得到最終的大數字和結果。
示例代碼
#include <stdio.h>
#include <string.h>
#include <stdlib.h>// 反轉字符串函數
void reverse(char *str) {int len = strlen(str);for (int i = 0; i < len / 2; i++) {char temp = str[i];str[i] = str[len - i - 1];str[len - i - 1] = temp;}
}// 大數相加函數
char* addLargeNumbers(const char *num1, const char *num2) {int len1 = strlen(num1);int len2 = strlen(num2);int maxLen = len1 > len2 ? len1 : len2;// 分配結果字符串,長度最多為 maxLen + 1(可能會有進位)char *result = (char *)malloc(maxLen + 2);memset(result, 0, maxLen + 2);// 反轉輸入字符串char n1[maxLen + 1], n2[maxLen + 1];strcpy(n1, num1);strcpy(n2, num2);reverse(n1);reverse(n2);// 補齊較短的數字for (int i = len1; i < maxLen; i++) n1[i] = '0';for (int i = len2; i < maxLen; i++) n2[i] = '0';int carry = 0;for (int i = 0; i < maxLen; i++) {int digit1 = n1[i] - '0';int digit2 = n2[i] - '0';int sum = digit1 + digit2 + carry;result[i] = (sum % 10) + '0';carry = sum / 10;}if (carry) result[maxLen] = carry + '0';// 反轉結果字符串reverse(result);return result;
}int main() {char num1[1000], num2[1000];printf("輸入第一個大數: ");scanf("%s", num1);printf("輸入第二個大數: ");scanf("%s", num2);char *sum = addLargeNumbers(num1, num2);printf("兩個大數的和: %s\n", sum);free(sum);return 0;
}