解题思路:
定义两个字符串 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分
2 人评分
分糖果 (C++代码)浏览:865 |
点我有惊喜!你懂得!浏览:972 |
【绝对值排序】 (C++代码)(利用两个库函数——abs()求绝对值 和 sort()快排)浏览:1424 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:591 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:488 |
C语言程序设计教程(第三版)课后习题12.3 (C语言代码)浏览:836 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:655 |
大神老白 (C语言代码)浏览:715 |
十->二进制转换 (C语言代码)浏览:1291 |
不容易系列 (C语言代码)浏览:669 |