c++解决大整数加法
问题描述:求两个不超过200为的非负整数的和
输入数据:输入有两行,每行是一个不超过200位的非负整数,没有多于的前导0.
输出要求:输出只一行,即相加后的结果。结果里不能有多于的前导0,即如果结果是342,那么就不能输出0342.
输入样例:
2222222222222222222222222
3333333333333333333333333
输出样例:
5555555555555555555555555
解题思路:int类型数据最多10位,double类型数据最多64位,因此,不能直接利用int或double类型数据相加求解。应考虑用数组(为方便读入数据,采用字符数组),采用列竖式的思路,对位相加,在考虑进位,最终求解。
C++代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
//定义变量
char x1[200]={'\0'};//两个不超过200位的加数
char x2[200]={'\0'};
int carry[201]={0};//进位
int result[201]={0};//和
int i;//循环变量
//输入
cin>>x1>>x2;
//求两char数组长度
int len1=strlen(x1);
int len2=strlen(x2);
//反序
strrev(x1);
strrev(x2);
//确定两序列长度的最大值
int lenmax=len1*(len1>=len2)+len2*(len1<len2);
//把char类型的加数数组转化为int
int x11[200]={0};
for(i=0;i<=len1-1;i++)
{
x11[i]=x1[i]-'0';
}
int x22[200]={0};
for(i=0;i<=len2-1;i++)
{
x22[i]=x2[i]-'0';
}
//不考虑进位对应位相加
for(i=0;i<=lenmax-1;i++)
{
result[i]=x11[i]+x22[i];
result[i+1]=0;//用于防止超过lenmax后的一位
}
//考虑进位 完成最终求和
for(i=0;i<=lenmax+1;i++)
{
carry[i+1]=result[i]/10;
result[i]=result[i]%10+carry[i];
}
//若最高位为0,则不输出最高位
if(result[lenmax]==0)
i=lenmax-1;
else
i=lenmax;
for(;i>=0;i--)
cout<<result[i];
cout<<endl;
return 0;
}