1. 主页
  2. 文档
  3. Level3题解(1-10)
  4. 第1课 高精度计算
  5. 高精度除法

高精度除法

高精度除单精度

在纸上写出除式并进行分析

竖式除法
            36      商
       ---------
12345 √ 452678
        37035	 12345*3=37035
         8232	 45267-37035=8232
         82328	 进行下一位处理
         74070	 12345*6=74070
          8258	 82328-74070=8258 余数

被除数的第一位和除数比较,比它小的话就再加一位,否则就可以计算商和余数,然后再用余数来加一位进行循环处理
实际处理的时候不用比较,小的话商就为0,输出结果的时候将商高位的0去掉就可以
主模块比较简单
读数
相除
输出商和余数

int y;//存储余数
int main(){
	int a[N],c[N],b;
	memset(a,0,sizeof(a));
	memset(c,0,sizeof(c));
	Read(a);
	cin>>b;
	Div(a,b,c);
	cout<<y<<endl;
	Out(c);
	return 0;
}
void Div(int a[],int b,int c[]){
	c[0]=a[0]; //商的位数
	for(int i=a[0];i>0;i--){
		y=y*10+a[i]; //被除数,每次处理一位
		c[i]=y/b; //商
		y%=b; //余数
	}
	while(c[0]>1&&c[c[0]]==0)c[0]--; //去掉高位上多余的0
	return;
}

高精度除高精度

思路:需要转化为减法来进行计算
先在纸上进行分析

两个数均为高精度数的时候,无法使用高精度除以单精度的方法
但在分析的时候,还是可以用两个较小的数来分析
如:a=12346578, b=139, 求 a÷b
在139后面填充0,使其位数与被除数一致,然后看被除数中包含了几个,这个可以用减法来实现
             088824
       ------------------   //tmp=13900000,139后面填充5个0,填充的0的个数为a[0]-b[0]+1
 139  /    12346578 //第一次商为0,Comp(a,tmp),第二次将139后面的0减少1位
           11120000 //a比tmp大时,循环执行Minus(a,tmp),直到a<tmp,每减1次,商c[i]++
            1226578 //循环处理
            1112000
             114578
             111200
             003378
               2780
               0598
                556
                 42 //最后剩下的a就是余数
int Comp(int a[],int b[]){
	int i;
	if(a[0]>b[0])return 1;
	if(a[0]<b[0])return -1;
	for(i=a[0];i>0;i--){
		if(a[i]>b[i])return 1;
		if(a[i]<b[i])return -1;
	}
	return 0;
}
void numcopy(int b[],int t[],int i){
	t[0]=b[0]+i-1; //t的位数,全部数字为0
	for(int j=b[0];j>0;j--)
		t[i+j-1]=b[j]; //将t数组的高位全部赋为b数组
}
void Div(int a[],int b[],int c[]){
	int i,j,t[N];
	c[0]=a[0]-b[0]+1;//商的最大位数
	for(i=c[0];i>0;i--){
		memset(t,0,sizeof(t));
		numcopy(b,t,i); //在b后面添加0,每次循环的时候0的个数会减少1,为方便处理,将其拷贝到t数组中。上一句话中已经将t数组全部赋0了,numcpy中只需要将b数组的每一位拷贝到t数组的高位就可以了
		while(Comp(a,t)>=0){//a比t大的时候就统计a中包含了多少个t(个数<10)
			c[i]++; //包含的个数就是第i位上的商
			Minus(a,t);  //标准减法模块
		}
	}
	while(c[0]>0&&c[c[0]]==0)c[0]--;//去掉商高位上多余的0
}
int main(){
	int f,a[N],b[N],c[N];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	Read(a); //标准读数模块
	Read(b);
	f=Comp(a,b);//根据a和b之间的三种大小关系分别处理,比较大小是标准模块
	if(f==0){ //相等则商为1,余数为0
		cout<<1<<endl<<0;
		return 0;
	}
	if(f==-1){ //a<b则商为0,余数为a
		cout<<0<<endl;
		Out(a);
		return 0;
	}
	Div(a,b,c); //a>b时进行高精度除法,c用来存储商,余数最终存在a中
	Out(c);  //标准输出模块
	Out(a);
	return 0;
}