问题描述:
求两个不超过200位的非负整数的和。
输入数据
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出要求
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例
22222222222222222222
33333333333333333333
输出样例
55555555555555555555
解题思路:
1) 用字符型或整型数组来存放大整数
an[0]存放个位数,an[1]存放十位数,an[2]存放百位数……
2)模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10则进位。
用unsigned an1[201]保存第一个数,用unsigned an2[200]表示第二个数,然后逐位相加,相加的结果直接存放在an1中。要注意处理进位。
#include <iostream>
#include <cstring>
#define MAXLINE 200
using namespace std;
char s1[MAXLINE + 10];
char s2[MAXLINE + 10];
int nLen1;
int nLen2;
int Add(int MaxLen, int *a1, int *a2)
{
int nHighesePos = 0;
for(int i = 0; i < MaxLen; ++i)
{
//将长度最多为nMaxLen的大整数an1和an2相加,结果放在an1,an1[0],an2[0],对应于个位
a1[i] += a2[i];
if(a1[i] >= 10)
{
a1[i] -= 10;
a1[i + 1]++;
}
if(a1[i + 1])
nHighesePos = i + 1;
}
return nHighesePos;
}
//求最大值
int Max(int x, int y)
{
return ((x > y) ? x : y);
}
int main()
{
cin >> s1;
cin >> s2;
nLen1 = strlen(s1);
nLen2 = strlen(s2);
int *a1 = new int[MAXLINE + 10]();//数组长度后面的一对(),对数组元素做值初始化,可以把数组元素值都设置为0
int *a2 = new int[MAXLINE + 10]();//对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组
//变量一样,用初始化列表为数组元素提供各不相同的初值
int MaxLen = Max(nLen1, nLen2);
//将地址an1开始的sizeof(an1)字节内容置成0
/*for(int i = 0; i <= MaxLen; ++i)
{
a1[i] = 0;
a2[i] = 0;
}*/
//将字符转换为十进制数存储在a1[i]和a2[i]中
for(int i = nLen1 - 1, j = 0; 0 <= i; --i)
{
a1[j++] = s1[i] - '0';
}
for(int i = nLen2 - 1, j = 0; 0 <= i; --i)
{
a2[j++] = s2[i] - '0';
}
int Pos = Add(MaxLen, a1, a2);
//输出各位
for(int i = Pos; 0 <= i; --i)
cout << a1[i];
delete [] a1;
delete [] a2;
return 0;
}