就像小学学的竖式加法一样,大数加法也按照这样的规律
两个大数我们可以用字符数组来保存,然后在数组中逐位进行相加,再判断该位相加后是否需要进位,为了方便计算,我们将数字的低位放在数组的前面,高位放在后面。
#include<stdio.h>
#include<string.h>
#define MAX 1000 // 大数的最大位数
int Addition(char num1[], char num2[], int sum[]);
int main()
{
int i, len;
int sum[MAX] = {0}; // 存放计算的结果,低位在前,高位在后,即sum[0]是低位
char num1[] = "1234567891234567891234"; // 第一个大数
char num2[] = "2345678912345678913345"; // 第二个大数
len = Addition(num1, num2, sum); // 两数相加
printf("%s\n +\n%s\n =\n", num1, num2);
// 反向输出求和结果
for (i = len-1; i >= 0; i--)
printf("%d", sum[i]);
printf("\n");
return 0;
}
int Addition(char num1[], char num2[], int sum[])
{
int i, j, len;
int n2[MAX] = {0};
int len1 = strlen (num1); // 计算数组num1的长度,即大数的位数
int len2 = strlen (num2); // 计算数组num2的长度,即大数的位数
len = len1>len2 ? len1 : len2; // 获取较大的位数
//将num1字符数组的数字字符转换为整型数字,且逆向保存在整型数组sum中,即低位在前,高位在后
for (i = len1-1, j = 0; i >= 0; i--, j++)
sum[j] = num1[i] - '0';
// 转换第二个数
for (i = len2-1, j = 0; i >= 0; i--, j++)
n2[j] = num2[i] - '0';
// 将两个大数相加
for (i = 0; i <= len; i++)
{
sum[i] += n2[i]; // 两个数从低位开始相加
if (sum[i] > 9) // 判断是否有进位
{ // 进位
sum[i] -= 10;
sum[i+1]++;
}
}
if(sum[len] != 0) // 判断最高位是否有进位
len++;
return len; // 返回和的位数
}