06:大整数加法
总时间限制: 1000ms 内存限制: 65536kB
描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
思路:
1)每一行都是不超过200位的整数,不能用long long类型,需要用字符数组才能存下。
2)然后转化成10进制数并把每一位反转存入数组(防止遇到长度不等的两个字符串个位最后无法匹配的问题)
3)让每一位从个位开始都逐个都相加,把每一位相加后的结果都存入单独的数组,把进位也单独用数组存起来
4)最后判断前导是否为0,为0就舍去,然后在倒序输出结果
具体AC代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main()
{
char a[201]; //存放第一行数
char b[201]; //存放第二行数
char num1[201];
char num2[201];
int carry[202];//存放进位
int result[202];//存放结果
int x = 0;//进位
int len3 = 1;
cin >> a>> b;
int len1 = strlen(a);
int len2 = strlen(b);
//把字符串转化为十进制数并把个位放在开头
for (int i = 0; i < len1; i++)
{
num1[len1 - i] = a[i] - '0';
}
for (int j = 0; j < len2; j++)
{
num2[len2 - j] = b[j] - '0';
}
while (len3 <= len1 || len3 <= len2)
{
result[len3] = num1[len3] + num2[len3] + x;//没除进位的值
x = result[len3] / 10;
result[len3] %= 10; //实际的值
len3++;
}
carry[len3] = x;
if (carry[len3] == 0)
{
len3--; //除去最高位
}
for (int i = len3; i >= 1; i--)
{
cout << result[i];
}
}