这道题是一道大整数加法,涉及到高精度的算法,比如说有两个数要进行相加,111111111111111111111111111111111111111+2222222222222222222222222222222,那么如果这两个数很大的话我们常用的数据类型是不能进行计算的,那么我们就需要另一种方式来进行解决,在这里我们可以使用到字符串和数组,我们使用字符串对两个数进行存储,用数组对字符串中的每个数分开存储,那么这样就做到了每位相加,变成了个位数与个位数相加,大大降低了我们计算的难度,我们在这里可以对两个数反序存储,因为后续我们进行相加的时候就可以从低位,下标从小到大,逐位相加,方便我们的操作。在我们进行存储的过程中,我们需要注意,可能会出现前导0,那么我们减去字符0即可,这样就去除我们的前导0,那么接下来我们思考,如何实现我们两个数相加的操作,我们两个数进行相加的时候,可能会有进位的产生,那么我们这个时候对两数相加的结果进行除10,将结果先赋值给下一位结果,既然当前有进位的可能,我们就需要将当前结果进行对10取模,这样我们一次两数相加的操作就结束了,接下来我们循环对两个数组进行此操作即可,结束后我们就得到了我们相加的结果,那么我们循环的终止条件是什么呢,我们循环的终止条件就是结果数组c[]一共有几位,想知道结果一共有几位,就需要知道两个相加的数一共有几位,我们两个数相加最多不超过两个数中最大数的位数+1,我们结果的位数lc就是max(la,lb)+1,在这里我们多留一位预判相加后最高位可能会产生进位,如果没有我们再对结果进行特殊处理即可,接下来我们就需要求出la,以及我们的lb,在这里我们可以定义一个变量aIndex,他表示我们数组加到第几位了,如果我们当前遍历的数不为0,我们就更新la,这样就确定了la,lb。最后我们就需要最结果进行输出,在对结果进行输出前,我们需要对结果数组中的数进行前导0的处理,如果我们最高位是0我们就需要对我们的lc进行减减的操作,这个操作是需要借助循环进行处理的,在这里我们使用while,循环的条件就是当前最高位的数如果为0,并且我们需要保证位数>=1的前提下,对lc--,
这样我们只需要对结果数组反向循环输出即可。
接下来是举例计算过程和代码
第一步对数据进行反序存储,如果两个数为123456和111111,我们对123456进行输出看看,
我们发现确实是反序存储了,
第二步对数据进行相加
结果也没有任何问题,那么如果是有前导0的两个数呢,例如0900和0000900呢
我们发现是有很多前导0的,但是在我们对结果数组进行处理之后(红色字体),去掉了前导0,并确定了结果一共有几位之后,我们就可以正确的输出结果
以下是AC代码
#include <iostream>
#include <string>
using namespace std;
#define int long long
int a[210], b[210], c[210];
//a数组 第一个数
//b数组 第二个数
//c数组 结果数组
signed main() {
string s1, s2; cin >> s1 >> s2;
//将字符串反序存入数组中
int aIndex = 1, bIndex = 1;
int la = 1, lb = 1,lc;//各个数的实际位数
for (int i = s1.size() - 1; i >= 0;i--) {
a[aIndex++] = s1[i] - '0';//去前导0
if (s1[i] != '0') la = aIndex - 1;//当前数不是0,更新最高位
}
for (int i = s2.size() - 1; i >= 0; i--) {
b[bIndex++] = s2[i] - '0';
if (s2[i] != '0') lb = bIndex - 1;
}
//将结果进行相加,存入c数组中
lc = max(la, lb) + 1;//多加一位,预防最高位也产生进位
for (int i = 1; i <= lc;i++) {
c[i] += a[i] + b[i];//需是+= 因为如果该位进行相加计算之前,该位可能有进位存储
c[i + 1] = c[i] / 10;
c[i] %= 10;
}
//去除c中的前导0,确定lc
while (!c[lc] && lc >= 1) lc--;
for (int i = lc; i >= 1;i--) {
cout << c[i];
}
return 0;
}