1、题目:实现两个大数相加。
2、算法流程:
(1)大数可能超出任何一种整数类型,会引发溢出问题,所以用字符串的格式存储字符串a,b;
(2)获取字符串a的长度为aLen,字符串b的长度为bLen;
(3)比较aLen和bLen的大小,用maxLen保存更大值。
(4)创建数组aArr,大小为maxLen,保存字符串a每一位上的值,举例下图所示。
(5)创建数组bArr,大小为maxLen,保存字符串b每一位上的值,不够的补0,例如。
(6)创建数组sumArr,大小为maxLen,保存两数之和。
(7)创建一个整数用于保存两数相加的进位jin,初始化等于0,是因为两个数的个位数相加进位一定等于0。
(9)因为两数相加一般从个位开始,所以用sumArr[maxLen-1]保存(a的个位+b的个位的+进位)的和除以10的余数,获取进位jin=(a的个位+b的个位的+进位)的和除以10的整除数。具体如下所示:
(10)各对应的位数相加完之后,判断进位jin是否等于1,如果等于1则输出 cout <<"1";
然后从高位到低位输出sumArr的各位数。
3、具体代码如下所示:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char* a="11111111111111111111111111";
char* b="91111111111111111111111111111111111";
int aLen=strlen(a);
int bLen=strlen(b);
cout << "aLen="<<aLen<<" bLen="<<bLen<<endl;
int maxLen=0;
if(aLen>bLen){
maxLen=aLen;
}else{
maxLen=bLen;
}
cout << "maxLen="<<maxLen<<endl;
int* aArr=new int[maxLen];
int* bArr=new int[maxLen];
int* sumArr=new int[maxLen];
for(int i=maxLen-1;i>=0;i--){
if(aLen<=0){
aLen=0;
aArr[i]=0;
}else{
aArr[i]=a[--aLen]-'0';
}
cout << aArr[i];
}
cout <<endl;
for(int j=maxLen-1;j>=0;j--){
if(bLen<=0){
bArr[j]=0;
}else{
bArr[j]=b[--bLen]-'0';
}
cout << bArr[j];
}
cout <<endl;
int jin=0;
for(int k=maxLen-1;k>=0;k--){
sumArr[k]=(aArr[k]+bArr[k]+jin)%10;
jin=(aArr[k]+bArr[k]+jin)/10;
cout << sumArr[k];
}
cout <<endl;
if(jin!=0){
cout <<"1";
}
for(int t=0;t<maxLen;t++){
cout << sumArr[t];
}
return 0;
}