专栏文章
题解:P1601 A+B Problem(高精)
P1601题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miotha9k
- 此快照首次捕获于
- 2025/12/03 00:53 3 个月前
- 此快照最后确认于
- 2025/12/03 00:53 3 个月前
前言
本题是我们高精度十分重要的一道题目,我们的高射炮也不用再打蚊子了,而且本题中我们将会给出一些代码的示范,望各位能汲取教训,而且请不要抄题解,作者曾经因为这个被粉兔紫菜过。
思路
我们的输入是常规的变量类型所存储不了的,我们可以使用字符数组来存储,注意,我们的加法是从最低位开始的,所以我们要将其倒置过来,那字符数组如何相加呢,我们只需要在反转时将其减去字符零,这样会由字符数字转为整数,就像这样:
CPPfor (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';
}
如果你没加,那你就是我们第一个错误示例,没有进行反转。
然后进行相加,这里我们还要再开一个整数数组,存储最后的结果。
每次我们先将三个数组相加,然后向下一位加上这个和整除十,就是进位。示例如下:
CPPfor (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;
}
如果你忘了进位,你就是我们的错误示范二号。
最后我们还需要检查,有没有最高位向前进位,示例如下:
CPP最后我们还需要检查,有没有最高位向前进位,示例如下:
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];
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...