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;
}
标签:数字,int,相加,C语言,char,maxLen,result,str,sum
From: https://blog.csdn.net/PeterClerk/article/details/140163762