大整数加法
问题描述
-
问题描述:求两个不超过200位的非负整数的和。
-
输入
多组测试数据。每组测试数据包括两行,每行一个数。 -
输出
一行,即相加后的结果。结果里不能有多余的前导0。 -
样例输入
22222222222222222222
33333333333333333333
-
样例输出
55555555555555555555
问题分析
-
输入要求整数不超过两百位,该整数有可能超出了
int
的表示范围,因此不能使用int
类型的变量接收,应使用字符串接收整数。 -
大整数加法的原理:两个整数从个位开始相加,如果相加结果大于
10
,则下一位进1
,依此类推。 -
为了实现加法运算,我们将接收到的字符串转换为用
int
类型的数组接收,数组每个元素对应整数的每一位,且数组最低位对应整数的最低位,即数组下标0
处对应整数的个位,下标1
处对应十位,依此类推。 -
最后输出时要去除前导
0
,原理:从最高位开始寻找第一个不为0
的数字,并记录该数字所在下标,之后从该下标开始向低位遍历输出。
代码实现
1.字符串转化
void strToNum(char* str, int* num, int sz)
{
int i = 0;
int j = 0;
for (i = sz - 1; j < sz; i--)
{
num[j++] = str[i] - '0';//char类型转化为int类型
}
}
2.逐位相加
void sum(int* num1, int* num2, int max)//max - 两个数中最大的位数
{
int i = 0;
for (i = 0; i < max; i++)//从最低位到最高位遍历
{
num1[i] += num2[i];
if (num1[i] >= 10)//相加结果如果大于10,,该位取模10,下一位加1
{
num1[i] = num1[i] % 10;
num1[i + 1]++;
}
}
}
3.输出
void printNum(int* num, int sz)//去除前导0并输出
{
int i = 0;
for (i = sz; i > -1; i--)//去除前导0
{
if(num[i])
{
break;
}
}
for (; i > -1; i--)//从第一个不是0的数开始输出
{
printf("%d", num[i]);
}
printf("\n");
}
4.main函数环境
int main()
{
char strNum1[201] = { 0 };//接收整数
char strNum2[201] = { 0 };
int num1[201] = { 0 };//接收转化后的整数
int num2[201] = { 0 };
printf("请输入两个整数:\n");
while (scanf("%s %s", strNum1, strNum2) != EOF)//多组输入
{
int sz1 = strlen(strNum1);//计算整数的位数
int sz2 = strlen(strNum2);
strToNum(strNum1, num1, sz1);
strToNum(strNum2, num2, sz2);
int max = (sz1 > sz2) ? sz1 : sz2;//获取两个整数中较大的位数
sum(num1, num2, max);
printf("结果为:\n");
printNum(num1, max);
}
return 0;
}
5.头文件
#include <stdio.h>
#include <string.h>