看到这个标题,肯定认为这是一篇水文罢,但其实不然,因为这里的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;
}