题解:P1601 A+B Problem(高精)

· · 题解

前言

本题是我们高精度十分重要的一道题目,我们的高射炮也不用再打蚊子了,而且本题中我们将会给出一些代码的示范,望各位能汲取教训,而且请不要抄题解,作者曾经因为这个被粉兔紫菜过。

思路

我们的输入是常规的变量类型所存储不了的,我们可以使用字符数组来存储,注意,我们的加法是从最低位开始的,所以我们要将其倒置过来,那字符数组如何相加呢,我们只需要在反转时将其减去字符零,这样会由字符数字转为整数,就像这样:

for (int i = 1; i <= la; i++) {
  a[i] = s[la - i + 1] - '0';
}
for (int i = 1; i <= lb; i++) {
  b[i] = s[lb - i + 1] - '0';
}

如果你没加,那你就是我们第一个错误示例,没有进行反转。 然后进行相加,这里我们还要再开一个整数数组,存储最后的结果。 每次我们先将三个数组相加,然后向下一位加上这个和整除十,就是进位。示例如下:

for (int i = 1; i <= lc; i++) {
  c[i] = a[i] + b[i] + c[i];
  c[i + 1] = c[i] / 10;
  c[i] = c[i] % 10;
}

如果你忘了进位,你就是我们的错误示范二号。\ 最后我们还需要检查,有没有最高位向前进位,示例如下:

if(c[lc+1] > 0)
lc++;

如果你这个没写,那你就是错误示范三。 最后别忘了倒着输出,就完成了。

代码

就知道你们喜欢看这个。

#include <bits/stdc++.h>
using namespace std;
char s[1001];
int a[1001], b[1001], c[1001];//三个整数数组
int la, lb, lc;//三个长度

int main () {
    scanf("%s", s + 1);//输入
    la = strlen(s + 1);//取长度
    for (int i = 1; i <= la; i++) {//反转
        a[i] = s[la - i + 1] - '0';
    }
    scanf("%s", s + 1);
    lb = strlen(s + 1);
    for (int i = 1; i <= lb; i++) {
        b[i] = s[lb - i + 1] - '0';
    }
    if (la > lb) {//将相加数组的长度取输入长度最大值
        lc = la;
    } else {
        lc = lb;
    }
    for (int i = 1; i <= 101; i++) {
        c[i] = 0;
    }
    for (int i = 1; i <= lc; i++) {//相加
        c[i] = a[i] + b[i] + c[i];
        c[i + 1] = c[i] / 10;//进位
        c[i] = c[i] % 10;
    }
    if(c[lc+1] > 0)//判断是否还有进位
    lc++;
    for(int i=lc;i>=1;i--){//倒过来输出
        cout << c[i];
    } 
}