专栏文章

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

P1601题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miotha9k
此快照首次捕获于
2025/12/03 00:53
3 个月前
此快照最后确认于
2025/12/03 00:53
3 个月前
查看原文

前言

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

思路

我们的输入是常规的变量类型所存储不了的,我们可以使用字符数组来存储,注意,我们的加法是从最低位开始的,所以我们要将其倒置过来,那字符数组如何相加呢,我们只需要在反转时将其减去字符零,这样会由字符数字转为整数,就像这样:
CPP
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';
}
如果你没加,那你就是我们第一个错误示例,没有进行反转。 然后进行相加,这里我们还要再开一个整数数组,存储最后的结果。 每次我们先将三个数组相加,然后向下一位加上这个和整除十,就是进位。示例如下:
CPP
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;
}
如果你忘了进位,你就是我们的错误示范二号。
最后我们还需要检查,有没有最高位向前进位,示例如下:
CPP
if(c[lc+1] > 0)
lc++;
如果你这个没写,那你就是错误示范三。 最后别忘了倒着输出,就完成了。

代码

就知道你们喜欢看这个。
CPP
#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 条评论,欢迎与作者交流。

正在加载评论...