高精度除法的实现

高精度除法与高精度加法的定义、前置过程都是大致相同的,如果想了解具体内容,可以移步至我的这篇博客:高精度加法计算的实现

在这里就不再详细讲解,只讲解主体过程qwq

主体过程

高精度除法的原理和小学学习的竖式除法是一样的。

概括来说,假如被除数长度为,除数长度为,为了减少冗余运算,我们从从后往前开始计算,将被除数与除数相对应的每一位相(整)除,实际上这一步可以看作一个逐次减法的过程,然后存进商的对应位置上,再将余数乘并放进下一位。

用高精度计算,先除百位,将减去一次后变为,小于,所以将存入百位,将存入十位;

再除十位,将减去三次后变为,小于,所以将存入十位,将存入个位;

最后除个位,将减去八次后变为,小于,所以将存入个位,将存入余数数组。

其实,高精度除法按理来说不需要反转存储,正序存储会更方便,但大部分题目,如果需要高精度除法去做,那么很有可能也需要其他的高精度计算,为了统一,我们还是使用反转存储。

接下来,我们这里实现一个函数,它判断了被除数以下标为最低位,是否可以再减去除数而保持非负。这个函数分为三部分:

  1. 被除数剩余的部分比除数长,这个情况下最多多出 1 位,函数返回真。
  2. 如第一步判断为假,就说明被除数与除数一样长,那我们就从高位到低位,逐位比较:如果被除数当前位比除数当前位大,函数返回真;反之,函数返回假。
  3. 如第二步也判断为假,就说明被除数与除数相等,相等的情形下也是可行的,函数返回真。

下面给出高精度除法的代码:

cpp 复制代码
bool big(int a[],int b[],int low,int L){
	if(a[low+L]!=0) return 1;
	for(int i=L-1;i>=0;--i){
		if(a[low+i]>b[i]) 
			return 1;
		if(a[low+i]<b[i])
			return 0;
	}
	return 1;
}
void div(int a[],int b[],int c[],int d[]){
	clear(c);
	clear(d);
	int la,lb;
	for(la=L-1;la>0;la--){
		if(a[la-1]!=0)
			break;
	}
	for(lb=L-1;lb>0;lb--){
		if(b[lb-1]!=0)
			break;
	}
	if(lb==0) return;
	for(int i=0;i<la;i++) d[i]=a[i];
	for(int i=la-lb;i>=0;i--){
		while(big(d,b,i,lb)){
			for(int j=0;j<lb;j++){
				d[i+j]-=b[j];
				if(d[i+j]<0){
					d[i+j+1]-=1;
					d[i+j]+=10;
				}
			}
			c[i]++;
		}
	}
}

高精度计算器(总结)

到这里,我们的高精度计算就全部完成了。

下面给出高精度计算器的代码:

cpp 复制代码
const int L=10000;
string s;
int a[L],b[L],c[L],d[L];
void clear(int a[]){
	for(int i=0;i<L;i++)
		a[i]=0;
}
void read(int a[]){
	cin>>s;
	int L=s.size();
	for(int i=0;i<L;i++)
		a[i]=s[L-1-i]-'0';
}
void print(int a[]){
	int i;
	for(i=L-1;i>=1;i--){
		if(a[i]!=0)
			break;
	}
	for(;i>=0;i--)
		cout<<a[i];
	cout<<endl;
}
void add(int a[],int b[],int c[]){
	clear(c);
	for(int i=0;i<L-1;++i){
		c[i]+=a[i]+b[i];
		if(c[i]>=10){
			c[i+1]+=1;
			c[i]-=10;
		}
	}
}
void sub(int a[],int b[],int c[]){
	clear(c);
	for(int i=0;i<L-1;++i){
		c[i]+=a[i]-b[i];
		if(c[i]<0){
			c[i+1]-=1;
			c[i]+=10;
		}
	}
}
void mul(int a[],int b[],int c[]){
	clear(c);
	for(int i=0;i<L-1;i++){
		for(int j=0;j<=i;j++)
			c[i]+=a[j]*b[i-j];
		if(c[i]>=10){
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
}
bool big(int a[],int b[],int low,int L){
	if(a[low+L]!=0) return 1;
	for(int i=L-1;i>=0;--i){
		if(a[low+i]>b[i]) 
			return 1;
		if(a[low+i]<b[i])
			return 0;
	}
	return 1;
}
void div(int a[],int b[],int c[],int d[]){
	clear(c);
	clear(d);
	int la,lb;
	for(la=L-1;la>0;la--){
		if(a[la-1]!=0)
			break;
	}
	for(lb=L-1;lb>0;lb--){
		if(b[lb-1]!=0)
			break;
	}
	if(lb==0) return;
	for(int i=0;i<la;i++) d[i]=a[i];
	for(int i=la-lb;i>=0;i--){
		while(big(d,b,i,lb)){
			for(int j=0;j<lb;j++){
				d[i+j]-=b[j];
				if(d[i+j]<0){
					d[i+j+1]-=1;
					d[i+j]+=10;
				}
			}
			c[i]++;
		}
	}
}

每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

相关推荐
find1star2 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing2 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21122 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP3 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN3 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218313 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤4 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate5 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran5 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹5 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统