输入两个正整数A、B,求A+B的值。

看到这个标题,肯定认为这是一篇水文罢,但其实不然,因为这里的A和B可以很大很大,例如10的200次方等等。大家都知道,long long最大也只能到2^64,所以这题显然不能直接计算,那么要如何计算?一起来看看吧。 

思路:这么大数字无法直接存储,那么我们可以把数字的每一位存在数组里,然后模拟竖式计算,这样无论多大都能存下来。由于直接用int类型数组没办法很好的分别存这两个数,所以可以考虑字符数组,它会自己将两个数分开,然后再转为int类型即可。此外,还需要考虑的是进位的问题,众所周知竖式计算当某一位大于9时,便让下一位+1,这一位-10,所以我们在模拟的过程中自然需要考虑进位。

以下是代码(附详细注释)

#include<iostream>
#include<string.h>
using namespace std;
int a[1000001], b[1000001], c[1000001], j;//每个数组第一个元素保存数组长度
bool x = false;//用来判断和的第一个非零位置(比如001应该输出1)
char s[1000001], ss[1000001];
int main() 
{
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));//初始化
	scanf("%s%s", s, ss);//读入两个数(以字符串的形式存储)
	a[0] = strlen(s);
	b[0] = strlen(ss);//获取长度
	//以下是反过来存的,可以免去补0这一步。
	//因为我们需要个位对个位这样相加,顺序存储的话可能会导致A的百位+B的十位。
	for (int i = 1; i <= a[0]; i++) //转化为数字
		a[i] = s[a[0] - i] - '0';
	for (int i = 1; i <= b[0]; i++) //转化为数字
		b[i] = ss[b[0] - i] - '0';
	for (j = 1; j <= max(a[0], b[0]) + 1; j++) //新数组最长也只会比原数组中长的那个多一位
	{
		c[j] = a[j] + b[j];//模拟竖式计算求和
		if (c[j] >= 10)//进位 
		{
			c[j] %= 10;
			a[j + 1]++;
		}
	}
	c[0] = j;
	for (int i = c[0]; i >= 1; i--) //输出
	{
		if (x == false && c[i] == 0) //删除前导零
			continue;
		x = true;
		cout << c[i];
	}
	if (x == false) //全是0,说明和就是0
		cout << 0;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值