洛谷——高精度乘法P1303A+B Problem

题目描述

高精度加法,相当于a+b problem,不用考虑负数.

输入格式

分两行输入。a,b \leq 10^{500}a,b≤10500

输出格式

输出只有一行,代表a+ba+b的值

输入输出样例

输入 #1复制

1
1

输出 #1复制

2

输入 #2复制

1001
9099

输出 #2复制

10100

这是一道非常经典的高精度的题目。高精度,一般是将我们所使用的计算机模拟超过计算机计算上限的加减乘除

这道题目我们就只是模拟大数的加法

我们先想象一下我们平时所使用的加法是如何计算的 , 这里我先用文字简单说一下,首先个位加个位 , 十位数字加十位 , 百位加百位。这样依次加到最后一位,当然在过程中不免会遇到需要进位的,这应该算是这道题目最难解决的问题了。

现在我们来看一下这道题目的难点,首先应该读取数字,可以知道我们的长整形都无法存储,所以我们只能使用字符串来存储,但是我们执行个位,十位,百位相加的时候是需要用数字来进行计算的,所以我们这里需要一个转换。

2、我们的进位,尤其是在最高位上的进位,例如1 + 9,我们应当如何去判断。

3、两个数字相加的位数如果不同 , 这时应当怎么进行计算

大家可以仔细想一想 ,现在我们在coding吧

	string a, b;
	cin >> a >> b;

这里我们读取字符串

	vector  p, q;
	vector  c;

储存两个转换成数字 , 我们打算使用动态数组进行存储,并且打算用c来存储答案。

//动态数组不太清楚的可以开一个足够题目范围的一般数组,效果是一样的

这里我们需要进位 , 所以我们应该从个位数向高位数依次存储这样可以方便我们进位

	for (int i = a.size() - 1; i >= 0; i--) {
		p.push_back(a[i] - '0');
	}
	for (int i = b.size() - 1; i >= 0; i--) {
		q.push_back(b[i] - '0');
	}

现在我们将两个字符串依次存入两个动态数组,这里数字减去‘0’(字符0)这是将字符转化为整形并且存入数组。

现在我们要开始实现我们的加法了

vector  add(vector p, vector q) {
	int t = 0 , i = 0;
	vector  c;

这里我们打算用 t 来进行对进位的判断。思路是这样的:我们每次在实施每一位数相加的时候再加上一个 t ,最后%10,应该就是我们的这个位上的数字了,t可以自己/10,表示进位,这里可以举个例子,

15 + 438,这里个位加个位 t = 5 + 8 = 13,13%10 = 3,所以个位数字就是3 , t现在是1 ,所以1就是我们所需要的进位, 这里再看十位,十位是1 + 3 + 1(t所表示的进位)此时t = 5,所以我们所得到 t%10 = 5 也就是十位 , 百位此时是4, 4+t,15的百位没有数字 , 所以我们不需要看15百位。

	while (i < p.size() || i < q.size()) {
		if (i < p.size()) t += p[i];
		if (i < q.size()) t += q[i];
		c.push_back(t % 10);
		i++;
		t /= 10;
	}

所以这里可以这样写。但是如果最后一位需要进位怎么办 , 比如说99+1,这两样是没办法算出百位的1的,所以这时候又需要关键的 t 了,如果最后t还是1的话,就再在最高位添加一个1就行了

	if (t) {
		c.push_back(1);
	}

至此,这道题目的所有难点都讲完了 , 如果有需要全部代码的,我放在下面了 , 大家尽量不要复制 , 如果有不会的地方可以私信也可以评论 , 我也会给大家回复

#include
#include
#include
using namespace std;
vector  add(vector p, vector q) {
	int t = 0 , i = 0;
	vector  c;
	while (i < p.size() || i < q.size()) {
		if (i < p.size()) t += p[i];
		if (i < q.size()) t += q[i];
		c.push_back(t % 10);
		i++;
		t /= 10;
	}
	if (t) {
		c.push_back(1);
	}
	return c;
}

int main() {
	string a, b;
	cin >> a >> b;
	vector  p, q;
	vector  c;
	for (int i = a.size() - 1; i >= 0; i--) {
		p.push_back(a[i] - '0');
	}
	for (int i = b.size() - 1; i >= 0; i--) {
		q.push_back(b[i] - '0');
	}
	c = add(p, q);
	for (int i = c.size() - 1; i >= 0; i--) {
		cout << c[i];
	}
	return 0;
}

你可能感兴趣的:(刷题学习,刷题集,算法,c++)