C语言实现大整数加法
题目描述:
1:大整数加法
总时间限制: 1000ms 内存限制: 65536kB
描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
#include <stdio.h>
#include <string.h>
int
main(void)
{
int bigInteger_1[201] = {0}; // 用来存放大整数1的整型数组
int bigInteger_2[201] = {0}; // 用来存放大整数2的整型数组
char sNum_1[201] = {'\0'}; // 用来接收用户输入的字符串形式的大整数1
char sNum_2[201] = {'\0'}; // 用来接收用户输入的字符串形式的大整数2
//输入大整数1和大整数2
scanf("%s %s", sNum_1, sNum_2);
/*
这两个循环的功能均是将字符串中的字符大整数,转换为int型数组中的整型值
并且转换后的int型数组中的低位序存储的是大整数的低位,即bigInteger_1[0]
存放的是大整数的个位,依次类推
*/
for (int i = 0, j = strlen(sNum_1) - 1; j >= 0; )
{
bigInteger_1[i++] = sNum_1[j--] - '0';
}
for (int i = 0, j = strlen(sNum_2) - 1; j >= 0; )
{
bigInteger_2[i++] = sNum_2[j--] - '0';
}
//进行大整数的加法
int k = 0;
while (k <= 200)
{
bigInteger_1[k] += bigInteger_2[k]; //将大整数从低位到高位依次相加
if (bigInteger_1[k] >= 10)
{
bigInteger_1[k+1]++;
bigInteger_1[k] -= 10;
}
k++;
}
/*
去除前导零将大整数加法的结果进行输出,思路是,从加完后的大整数的最高位开始寻找
找到第一个不为零的数字后,记录这个不为零的数字在bigInteger数组中的索引,如果全部
数字全部为零,那么就输出零,否则就输出大整数中第一个不为零的数字及其后面的所有
数字。
*/
int mark = 0; // 用来记录第一个不为零的数字的索引
int i = 0;
for (i = 200; i >= 0; i--)
{
if (bigInteger_1[i] != 0)
{
mark = i; // 记录大整数中第一个不为零的数字的索引
break; // 结束循环
}
}
/*
如果i的值等于-1,说明遍历完大整数数组,也没有发现大整数数组中有存在非零的数
因此就可以判定大整数加完之后的结果就是零
*/
if (i == -1)
{
printf("0\n");
}
else
{
for (int i = mark; i >= 0; i--)
{
printf("%d", bigInteger_1[i]); // 从大整数中第一个不为零的索引开始进行遍历输出
}
putchar('\n');
}
return 0;
}
提交结果
注意事项:
- 忘记将bigInteger数组进行初始化,因为如果忘记将该数组中的全部内容全部初始化,就会导致数组中的全部初始值就是不确定的,这样在去除前导零时就会出错
- 在将字符串中的字符数字转换到int型数组中时,一定要分清楚int型数组的低位序存放的是大整数的低位还是高位,因为这样会影响大整数的加法操作
- 在进行大整数加法时,一定要从大整数的最低位开始相加,相加时不要忘记进位
今天的文章C语言大整数加法_for循环每行输出5个分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/74603.html