(C语言)两个大整数相加算法实现
实际问题
-
我们在学术研究中,包括统计数据、天文物理理论研究时等等,会遇到极其大的数字进行计算。
-
而对于计算机而言,一般可存储数据的大小不超过
unsigned long
、long long
的范围,可以利用数组存储字符串来模拟大数相加,数据上限可达到内存允许的范围内(可见这可应用到人类当前的认知范围内的数字)。
思路
- 大数输入输出的问题已解决,那么怎么用代码实现,我们可以像在草稿纸上用竖式进行加法运算一样,逢10进1。
步骤
- 创建字符类型的数组
str1
,str2
,全部赋为'0'
,用于接收输入的作为字符串的数字 - 获取字符串
str1
,str2
的长度len1
,len2
- 创建整数类型的数组
arr1
,arr2
全部赋为{0}
用于接收字符类型数组倒序转换成的整数(倒序后以便从个位十位……最高位依次在数组的0位置开始计算,直到数组的最后一位) - 将
len
赋为len1
,len2
中最大的一个 - 创建整数类型数组
res
,保存arr1
,arr2
相加的结果,过程中判断是否需要进位(下述代码中有注释) - 倒序输出
res
(从高位依次往地位输出),即为最终结果
代码实现
#include <stdio.h> // 两个大整数相加
#include <string.h>
int main() {
char str1[64] = {'0'},str2[64] = {'0'};
int arr1[64] = {0},arr2[64] = {0},res[65] = {0},s;
scanf("%s",&str1);
scanf("%s",&str2);
unsigned long len,len1 = strlen(str1),len2 = strlen(str2);
for (int i = 0,j = len1 - 1; j >= 0; ++i,--j) {
arr1[i] = str1[j] - '0'; //减去'0'是为了将字符转换成数字
}
for (int i = 0,j = len2 - 1; j >= 0; ++i,--j) {
arr2[i] = str2[j] - '0';
}
(len1 > len2) ? (len = len1) : (len = len2); //利用三目运算符确定较长字符串的长度
_Bool flag = 0; //用_Bool定义flag来判断是否需要进位
for (int i = 0; i < len; ++i) {
if(!flag) {
s = arr1[i] + arr2[i];
} else {
s = arr1[i] + arr2[i] + 1; //此时flag值为1,因此要加上一位数所进的1(一位数加法运算最大是9+9 = 18,因此+1)
}
if(s >= 10) {
res[i] = s % 10;
flag = 1; //表示留个位,进一位
} else {
res[i] = s;
flag = 0; //表示不用进位
}
}
if(res[len] > 0) len++; //判断最大一位是否有进位
for (int i = len - 1; i >= 0; --i) {
printf("%d",res[i]); //最后将res倒序输出,即为两数之和的结果
}
}