(C语言)两个大整数相加算法实现

(C语言)两个大整数相加算法实现

实际问题

  • 我们在学术研究中,包括统计数据、天文物理理论研究时等等,会遇到极其大的数字进行计算。

  • 而对于计算机而言,一般可存储数据的大小不超过unsigned longlong long的范围,可以利用数组存储字符串来模拟大数相加,数据上限可达到内存允许的范围内(可见这可应用到人类当前的认知范围内的数字)。

思路

  • 大数输入输出的问题已解决,那么怎么用代码实现,我们可以像在草稿纸上用竖式进行加法运算一样,逢10进1

步骤

  1. 创建字符类型的数组str1str2,全部赋为'0',用于接收输入的作为字符串的数字
  2. 获取字符串str1str2的长度len1len2
  3. 创建整数类型的数组arr1,arr2全部赋为{0}用于接收字符类型数组倒序转换成的整数(倒序后以便从个位十位……最高位依次在数组的0位置开始计算,直到数组的最后一位)
  4. len赋为len1len2中最大的一个
  5. 创建整数类型数组res,保存arr1,arr2相加的结果,过程中判断是否需要进位(下述代码中有注释)
  6. 倒序输出res(从高位依次往地位输出),即为最终结果

代码实现

#include  // 两个大整数相加
#include 

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倒序输出,即为两数之和的结果
    }
}

你可能感兴趣的:(算法,c语言)