题目:实现两个大数相加
/********************************************************************************************
1、题目:实现两个大数相加
2、算法流程:
(1)大数可能超出任何一种整数类型,会引发溢出问题,所以用字符串的格式存储字符串a,b;
(2)获取字符串a的长度为aLen,字符串b的长度为bLen;
(3)比较aLen和bLen的大小,用maxLen保存更大值。
(4)创建数组aArr,大小为maxLen,保存字符串a每一位上的值,举例下图所示。
image.png
(5)创建数组bArr,大小为maxLen,保存字符串b每一位上的值,不够的补0,例如。
image.png
(6)创建数组sumArr,大小为maxLen,保存两数之和。
(7)创建一个整数用于保存两数相加的进位jin,初始化等于0,是因为两个数的个位数相加进位一定等于0。
(9)因为两数相加一般从个位开始,所以用sumArr[maxLen-1]保存(a的个位+b的个位的+进位)的和除以10的余数,获取进位jin=(a的个位+b的个位的+进位)的和除以10的整除数。具体如下所示:
image.png
(10)各对应的位数相加完之后,判断进位jin是否等于1,如果等于1则输出 cout <<"1";
参考:https://www.jianshu.com/p/fdeb84644b50
********************************************************************************************/
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char* a = "12311111111111111111111456";
char* b = "911111111111111111111111111111111178";
//1、分别求两个数组长度
int aLen = strlen(a);
int bLen = strlen(b);
cout << "aLen=" << aLen << " bLen=" << bLen << endl;
int maxLen = 0;
//2、计算数字大的那个位数
if (aLen>bLen)
{
maxLen = aLen;
}
else
{
maxLen = bLen;
}
cout << "maxLen=" << maxLen << endl;
//3、申明一个整形一维数组aArr,同时分配maxLen个整数大小的空间,等价于int aArr[]
int* aArr = new int[maxLen]; //表示申明一个整形一维数组aArr,同时分配maxLen个整数大小的空间,等价于int aArr[]
int* bArr = new int[maxLen];
int* sumArr = new int[maxLen];
//4、给新数组赋值,主要功能是将char型转换为整型,并将不足的位数补零
cout << " aArr[]=";
for (int i = maxLen - 1; i >= 0; i--)
{
if (aLen <= 0) //位数不够的补零
{
aLen = 0;
aArr[i] = 0;
}
else
{
aArr[i] = a[--aLen] - '0';//从个位开始(数组最后一位),将char转换为数字,方便下面进行计算。
}
cout << aArr[i];
}
cout << endl;
//数组2的处理方式同上
cout << " bArr[]=";
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;
//5、求和,主要是两个操作,一个求余,一个求整
int jin = 0;
cout << "sumArr[k]=";
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";
}
cout << "sumArr[t]=";
for (int t = 0; t<maxLen; t++)
{
cout << sumArr[t];
}
return 0;
}