题目:实现两个大数相加


/********************************************************************************************



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;
}