高精度除单精度
在纸上写出除式并进行分析
竖式除法
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;
}