解题思路:
屏幕截图 2023-11-26 121928.png

定义两个字符串 s1 和 s2,用于存储输入的两个大整数。

通过 scanf 从标准输入中读取两个字符串。

计算两个字符串的长度 la 和 lb,以确定大整数的位数。

初始化数组 a 和 b,用于存储将字符转换为整数后的数字。遍历字符串 s1 和 s2,将每个字符转换为整数并存储在相应的数组中。

计算结果数组 c 的长度 lc,即两个输入字符串中较长的长度加1,以便处理可能的进位。

使用循环进行高精度加法操作:

从最低位开始,逐位将数组 a 和 b 中的数字相加,同时加上上一位的进位。

计算当前位的结果并将余数存储在 c 中,同时将整数部分作为进位传递给下一位。

检查最高有效位(c[lc])是否为0,如果是0且数组长度大于0,则删除前导0,即将 lc 减1。

最后,逆序输出数组 c 中的结果,即从高位到低位。

这个代码的主要目的是实现两个大整数的高精度加法,处理了进位和前导0的情况,最终输出结果。






参考代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
 
char s1[201];
char s2[201];
int a[201], b[201], c[201];
 
int main() {
    // 从标准输入读取两个字符串
    scanf("%s", s1);
    scanf("%s", s2);
 
    // 计算输入字符串的长度
    int la = strlen(s1);
    int lb = strlen(s2);
 
    // 初始化数组a和b,用于存储将字符转换为整数后的数字
    for (int i = 0; i < la; i++)
    {
        a[la - i] = s1[i] - '0'; // 将字符转换为整数并存储在a数组中
    }
    for (int i = 0; i < lb; i++)
    {
        b[lb - i] = s2[i] - '0'; // 将字符转换为整数并存储在b数组中
    }
 
    // 计算lc,即c数组的长度,也就是两个输入字符串中较长的长度加1
    int lc = la > lb ? la + 1 : lb + 1; // 用于处理进位
 
    // 执行高精度加法
    for (int i = 1; i <= lc; i++)
    {
        c[i] += a[i] + b[i]; // 将a、b中对应位置的数字相加并加上进位
        c[i + 1] = c[i] / 10; // 计算进位
        c[i] = c[i] % 10; // 计算当前位的结果
    }
 
    // 删除前导0,即去掉结果数组中最高有效位后的0
    if (c[lc] == 0 && lc > 0)
    {
        lc--; // 删除前导0
    }
 
    // 输出结果
    for (int i = lc; i > 0; i--)
    {
        printf("%d", c[i]); // 逆序输出结果,即从高位到低位
    }
 
    return 0;
}

lc > 0 的判断是为了确保不会删除所有前导0。在高精度计算中,前导0通常不会影响数字的值,但是为了表示一个数字的唯一性,我们通常会保留一个前导0,以确保表示的是正数而不是0。

考虑以下情况:如果两个数字相加的结果确实是0,那么删除所有前导0后,结果将变为空字符串,这可能不是我们想要的。为了保留一个前导0,我们使用 lc > 0 来检查最高有效位是否为0。如果最高有效位是0,但 lc 仍然大于0,那么我们会删除前导0,将 lc 减小到0。但是,如果 lc 已经为0,表示结果确实是0,就不需要再删除前导0了。

所以,lc > 0 的判断是为了确保至少保留一个前导0,以表示结果为正数而不是0。

假设我们要计算数字123456和数字789相加,结果是124245。如果我们不删除前导0,输出结果将是00124245,但通过删除前导0,输出结果将是124245。

点赞(0)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论