C/C++组蓝桥杯---带你轻松解决高精度问题 | 模板

顾得泉:个人主页

个人专栏:《Linux操作系统》 《C++从入门到精通》  《LeedCode刷题》

键盘敲烂,年薪百万!


一、高精度加法

1.实现思路

       函数首先检查数组A和B的大小关系,如果A的大小小于B的大小,则交换A和B的顺序,确保A是较长的数组。

       然后,创建一个空的整数数组C,用于存储相加的结果。

       接下来,使用一个循环遍历数组A的元素。在每次迭代中,将当前位置的元素值与变量t相加,t初始值为0。如果当前位置小于数组B的大小,则将数组B对应位置的元素值也加到t上。

       然后,将t对10取模的结果添加到数组C中,表示当前位的和。接着,将t除以10,以便处理下一位的进位。

       最后,如果t不为0(即还有进位),则将其添加到数组C的末尾。函数返回数组C作为结果。

注意,这段代码假设输入的数组A和B都是非负整数数组,且每个元素都在0到9之间。

2.核心代码

vector<int> add(vector<int> A, vector<int> B)
{
	if (A.size() < B.size())
		return add(B, A);

	vector<int> C;
	int t = 0;
	for (int i = 0; i < A.size(); i++)
	{
		t += A[i];
		if (i < B.size())
			t += B[i];
		C.push_back(t % 10);
		t /= 10;
	}
	if (t)
		C.push_back(t);
	return C;
}

3.测试运行

       main函数内容,仔细体会其中的奥秘!

int main()
{
	string a, b;
	cin >> a >> b;

	vector<int> A, B;
	for (int i = a.size() - 1 ; i >= 0 ; i --)
		A.push_back(a[i] - '0');
	for (int i = b.size() - 1 ; i >= 0 ; i --)
		B.push_back(b[i] - '0');

	vector<int> res = add(A, B);
	reverse(res.begin(), res.end());
	for (auto s : res)
		cout << s;

	return 0;
}

测试结果:


二、高精度减法

1.实现思路

       函数首先创建一个空的整数数组C,用于存储相减的结果。

       接下来,使用一个循环遍历数组A的元素。在每次迭代中,将当前位置的元素值与变量t相减,t初始值为0。如果当前位置小于数组B的大小,则将数组B对应位置的元素值也从t中减去。

       然后,将t加上10再对10取模的结果添加到数组C中,表示当前位的差值。这样做是为了处理借位的情况。

       接着,根据t的值判断是否有借位。如果t小于0,说明有借位,将t设置为1;否则,将t设置为0。

       最后,通过循环移除数组C末尾的0元素,直到C的大小为1或最后一个元素不为0。函数返回数组C作为结果。

2.核心代码

vector<int> sub(vector<int> A, vector<int> B)
{
	vector<int> C;
	int t = 0;
	for (int i = 0; i < A.size(); i++)
	{
		t = A[i] - t;
		if (i < B.size())
			t -= B[i];
		C.push_back((t + 10) % 10);
		if (t < 0)
			t = 1;
		else
			t = 0;
	}
	while (C.size() > 1 && C.back() == 0)
		C.pop_back();
	return C;
}

3.测试运行

int main()
{
	string a, b;
	cin >> a >> b;

	vector<int> A, B;
	for (int i = a.size() - 1 ; i >= 0 ; i --)
		A.push_back(a[i] - '0');
	for (int i = b.size() - 1 ; i >= 0 ; i --)
		B.push_back(b[i] - '0');

	vector<int> res = sub(A, B);
	reverse(res.begin(), res.end());
	for (auto s : res)
		cout << s;

	return 0;
}

测试结果:


三、高精度乘法

1.实现思路

       函数首先创建一个空的整数数组C,用于存储相乘的结果。

       接下来,使用一个循环遍历数组A的元素。在每次迭代中,如果当前位置小于数组A的大小,则将数组A对应位置的元素值乘以整数b,并将结果累加到变量t中。

       然后,将t对10取模的结果添加到数组C中,表示当前位的乘积。接着,将t除以10,以便处理进位。

       最后,通过循环移除数组C末尾的0元素,直到C的大小为1或最后一个元素不为0。函数返回数组C作为结果。

2.核心代码

vector<int> mul(vector<int> A, int b)
{
	vector<int> C;
	int t = 0;
	for (int i = 0; i < A.size() || t; i++)
	{
		if (i < A.size())
			t += A[i] * b;
		C.push_back(t % 10);
		t /= 10;
	}
	while (C.size() > 1 && C.back() == 0)
		C.pop_back();
	return C;
}

3.测试运行

int main()
{
	string a;
	int b, t;
	cin >> a >> b;

	vector<int> A;
	for (int i = a.size() - 1; i >= 0; i--)
		A.push_back(a[i] - '0');

	vector<int> res = mul(A, b);
	reverse(res.begin(), res.end());
	for (auto s : res)
		cout << s;

	return 0;
}

测试结果:


四、高精度除法

1.实现思路

       函数首先创建一个空的整数数组C,用于存储相除的结果。

       接下来,使用一个循环从数组A的末尾开始遍历元素。在每次迭代中,将变量t乘以10再加上当前位置的元素值,然后将t除以整数b,并将商添加到数组C中。接着,将t对b取模,以便处理余数。

       然后,通过调用reverse函数将数组C反转,使其顺序与原始数组A一致。

       最后,通过循环移除数组C末尾的0元素,直到C的大小为1或最后一个元素不为0。函数返回数组C作为结果。

2.核心代码

vector<int> div(vector<int> A, int b)
{
	vector<int> C;
	int t = 0;
	for (int i = A.size() - 1; i >= 0; i--)
	{
		t = t * 10 + A[i];
		C.push_back(t / b);
		t %= b;
	}
	reverse(C.begin(), C.end());
	while (C.size() > 1 && C.back() == 0)
		C.pop_back();
	return C;
}

3.测试运行

int main()
{
	string a;
	int b, t;
	cin >> a >> b;

	vector<int> A;
	for (int i = a.size() - 1; i >= 0; i--)
		A.push_back(a[i] - '0');

	vector<int> res = div(A, b);
	reverse(res.begin(), res.end());
	for (auto s : res)
		cout << s;

	return 0;
}

测试结果:


结语:C++关于高精度问题的分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~ 

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾得泉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值