基础算法 高精度(一)

目录

一:高精度概念

二:高精度加法

三:高精度减法


一:高精度概念处理大数字的计算方法。顾名思义就是在计算大数字的一种算法,为什么要用这种算法呢?我们日常计算的是位数相对较少,精确度不高。当遇到一些位数很多精度更高的时候就需要用到这个算法。)


二   高精度加法

首先我们来看一下代码:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int>add(vector<int>& A, vector<int>& B)
{
	int t = 0;//定义一个进位t
	if (A.size() < B.size())//如果A小于B相加时将两个数字调换
		add(B, A);
	vector<int>C;
	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;
}
int main()
{
	string a, b;
	vector<int>A, B;
	cin >> a >> b;
	for (int i = a.size() - 1; i >= 0; i--)//将a每一个数字输入A数组中,将最高为存在数组的最后
	{
		A.push_back(a[i] - '0');
	}
	for (int i = b.size() - 1; i >= 0; i--)//将b每一个数字输入B数组中,同上
	{
		B.push_back(b[i] - '0');
	}
	auto c=add(A, B);//调用相加函数
	for (int i = c.size() - 1; i >= 0; i--)//将数组从高为到低位依次输出
	{
		cout << c[i];
	}
	return 0;
}

高精度加法相对容易理解,这个代码中的“t”是一个进位的作用,当t>=10时向高位进一位,当t<0时,则不进位。

其他的就是关于头文件<vector>的语法,这个后续我会进行补充。

这个就是加法的代码,如果有什么疑问欢迎评论,共同进步~~。


三   高精度减法

关于高精度减法比加法略微复杂,因为需要进行判断两个数的大小,还有在这里说明一下:两个数均为正整数。话不多说直接看代码。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
bool cmp(vector<int>& A, vector<int>& B)//A>B返回值为true
{
	if (A.size() != B.size())
		return A.size() > B.size();

		for (int i = A.size()-1; i >=0; i--)
		{
			if (A[i] != B[i])
				return A[i] > B[i];
		}
	return true;
}
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 = t-B[i];
		C.push_back((t + 10) % 10);
		if (t >= 0)t = 0;
		else
			t = 1;
	}
	while (C.size() > 0 && C.back() == 0)//抹除最高位为0的情况 如111-110=001;可以削去0;
		C.pop_back();
	return C;
}
int main()
{
	string a, b;
	vector <int>A, B;
	cin >> a >> b;
	for (int i = a.size() - 1; i >= 0; i--)//将数字a输入到数组A中,最高位放在数组最后一位
	{
		A. push_back(a[i] - '0');
	}
	for (int i = b.size() - 1; i >= 0; i--)//将数字b输入到数组B中,同上
	{
		B.push_back(b[i] - '0');
	}
	vector<int>C;
	if (cmp(A, B))//cmp为判断A,B的大小
	{
		C = sub(A, B);//A大于B,A-B
	}
	else
	{
		C = sub(B, A);//A小于B,B-A
		cout << "-";//输出时前面加负号
	}
	
	for (int i = C.size() - 1; i >= 0; i--)//输出结果
	{
		cout << C[i];
	}

	return 0;
}

具体情况代码中有注释,可以在草稿纸上进行演算,来推导代码是如何运行的。

希望这篇文章对大家有所帮助,如果有什么疑问,欢迎来讨论~,共同进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值