高精度除高精度

例题P1480 A/B Problem

其实该题用高精度除低精度算法也能做

参考视频:高精度算法全套(加,减,乘,除,全网最详细)

#include <bits/stdc++.h>
using namespace std;
void numpy(vector<int>&b,vector<int>&temp,int n)		//把b向左移动n-1位到temp,n是当前商的位置(最低位视为C1),如商可分为C4C3C2C1,从左到右依次为高位,低位
{
	
	for (int i = 0; i < n; i++)		//因为商数组用vector,所以每次循环传入的就是n-1。
	{
		temp.push_back(0);
	}
	for (int i = 0; i < b.size(); i++)
	{
		temp.push_back(b[i]);
	}
}
vector<int>jianfa(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);		//同时考虑t>0与t<0的情况
		if (t < 0)t = 1;		//借位
		else t = 0;			//不用借位
	}
	while (c.size() > 1 && c.back() == 0)c.pop_back();		//从高位去前导零
	return c;
}
bool compare(vector<int>a, vector<int>temp)
{
	if (a.size() != temp.size())	return a.size()>temp.size();		//如果长度不一样
	else {			//如果长度一样,从最高位开始比较
		for (int i = a.size() - 1; i >= 0; i--)
		{
			if (a[i] != temp[i])	return a[i] > temp[i];
		}
	}
	return true;			//如果都一样长,返回1
}
void chufa(vector<int>& a, vector<int>& b)
{
	vector<int>d(a.size() - b.size() + 1, 0);		//商数组d的最大长度是两个数长度之差再加1;
	for (int i = d.size() - 1; i >= 0; i--)			//从最高位开始
	{
		vector<int>temp;			//b移位后的临时数组
		numpy(b, temp, i);	//把b向左移动n-1位到temp,n是当前商的位置(最低位视为C1),如商可分为C4C3C2C1,从左到右依次为高位,低位
		while (compare(a, temp))		//如果a>=temp
		{
			d[i]++;
			a=jianfa(a, temp);		//两数组相减
		}
	}
	while (d.size() > 1 && d.back() == 0)d.pop_back();		//去除前导0,该d数组是商的低位到高位,不用翻转
	for (int i = d.size() - 1; i >= 0; i--)	cout << d[i];		//输出高精度的商
	//若要输出余数,则可以遍历循环a即可,因为a逐渐减去后剩下余数了
}
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] - 48);
	for (int i = b.size() - 1; i >= 0; i--)B.push_back(b[i] - 48);
	if (a.size() < b.size())
	{
		cout << 0 << endl;		//如果a<b,则商为0。
		return 0;
	}
	chufa(A, B);//函数应用于a>b的情况或a和b长度一样的情况	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值