高精度运算(加减乘除)

对于加减乘除运算,我们并不陌生,但是众所周知,整型的存储是有范围的,但是有时候我们不免要进行特别大的数的运算,这时候就要使用高精度运算了

存大数(数组):数位从低往高存
 如果输入的数是负数,就要分情况讨论

目录

高精度加法

高精度减法

高精度乘法

高精度除法


高精度加法

vector<int> add(vector<int>& A, vector<int>& B)
{
	vector<int>c;
	int t = 0;
	for (int i = 0; i < A.size() || i < B.size(); i++)
	{
		//如果直接相加可能会导致数组越界
		if (i < A.size()) t += A[i];
		if (i < B.size()) t += B[i];
		c.push_back(t % 10);
		t /=10;
	}
	//判断最高位是否还需要进位
	while (t) c.push_back(t % 10), t /= 10;
	return c;
}
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');
	}
	//相加
	auto ret = add(A, B);
	for (int i = ret.size() - 1; i >= 0; i--) cout << ret[i];
	return 0;
}

高精度减法

bool cmp(vector<int>A, vector<int>B)
{
	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 -= B[i];
		c.push_back((t + 10) % 10);//原本是正数则不会改变,是负数就相当于借位
		//判断是否发生了借位
		if (t < 0) t = 1;
		else t = 0;
	}
	//删去前面的0(在数组中前面的0是存储在最后的)
	while (c.size() > 1 && c.back() == 0) c.pop_back();
	return c;
}
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');
	}
	//判断大小
	if (cmp(A, B))
	{
		auto ret = sub(A, B);
		for (int i = ret.size() - 1; i >= 0; i--) cout << ret[i];
	}
	else
	{
		auto ret = sub(B, A);
		cout << "-";
		for (int i = ret.size() - 1; i >= 0; i--) cout << ret[i];
	}
	return 0;
}

高精度乘法

vector<int> mul (vector<int>A, int b)
{
	vector<int>c;
	int t = 0;
	for (int i = 0; i < A.size(); i++)
	{
		//将大数的每一位与“小数”相乘,之后在进行进位运算
		t += A[i] * b;
		c.push_back(t % 10);
		t /= 10;
	}
	//写法2
	//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 (t) c.push_back(t % 10), t /= 10;
	while (c.size() > 1 && c.back() == 0)c.pop_back();
	return c;
}
int main()
{
	//读入大整数
	string a;
	int b;
	cin >> a >> b;
	vector<int>A;
	//逆序存入大整数
	for (int i = a.size() - 1; i >= 0; i--)
	{
		A.push_back(a[i] - '0');
	}
	auto ret = mul(A, b);
	for (int i = ret.size() - 1; i >= 0; i--) cout << ret[i];
	return 0;
}

高精度除法

vector<int> div(vector<int>A, int b,int &r)
{
	//先整除,再将余数*10于下一位相加,再整除,以此类推
	vector<int>c;
	r = 0;
	for (int i = A.size() - 1; i >= 0; i--)
	{
		r = r * 10 + A[i];
		c.push_back(r / b);
		r %= b;
	}
	//由于是正着存入的,而主函数中是倒着输出的,所以要把c翻转一下
	reverse(c.begin(), c.end());
	//去除前导0
	while (c.size() > 1 && c.back() == 0) c.pop_back();
	return c;
}
int main()
{
	//读入大整数
	string a;
	int b;
	cin >> a >> b;
	vector<int>A;
	//逆序存入大整数
	for (int i = a.size() - 1; i >= 0; i--)
	{
		A.push_back(a[i] - '0');
	}
	int r = 0;//保存余数
	auto ret = div(A, b, r);
	for (int i = ret.size() - 1; i >= 0; i--) cout << ret[i];
	cout << "……" << r << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值