前言
采用计算机做高精度除法时,模拟日常除法的步骤。但计算机不可能做“试商”,这时,我们可以采用减法来模拟"试商"的过程。算法的步骤如下:
1、将除数移动和被除数对齐,位数不够时,补0。
2、利用被除数减去除数,一直减到被除数小于除数,减的次数,就是“试商”的结果,每移动一次。
3、重复上述步骤,一直到被除数和除数的位数相等为止。
一、高精度除低精度
代码如下:
#include<bits/stdc++.h>
using namespace std;
vector<int> div(vector<int> &A,int b,int &r)//r是余数,引用。
{
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;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0) C.pop_back();//去前导0
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');
//将a存储在int类型的动态数组中,并且翻转,方便后续计算。
int r;
vector<int> C = div(A,b,r);
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
cout<<endl<<r<<endl;
return 0;
}
二、高精度除高精度
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005];
int c[100005];
int compare(int a[],int b[])
{//比较数组:若a>b则为1,a<b则为-1
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>0;i--)
{
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;//各位都相等返回0
}
void copyarray(int p[],int q[],int m)
{//复制数组
for(int i=1;i<=p[0];i++)
{
q[i+m-1]=p[i];
}
q[0]=p[0]+m-1;
}
void sub(int a[],int b[])
{//数组求差:a=a-b
int flag,i;
flag=compare(a,b);
if(flag==0)//相等
{
a[0]=0;
return;
}
if(flag==1)//大于
{
for(int i=1;i<=a[0];i++)
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while(a[0]>0&&a[a[0]]==0) a[0]--;
}
}
void div(int a[],int b[],int c[])
{//用减法来模拟除法
int i,tmp[101];
c[0]=a[0]-b[0]+1;
for(int i=c[0];i>=1;i--)
{
memset(tmp,0,sizeof(tmp));
copyarray(b,tmp,i);
while(compare(a,tmp)>=0)
{
c[i]++;//减法次数计数
sub(a,tmp);//数组求差
}
}
while(c[0]>0&&c[c[0]]==0) c[0]--;
}
void print(int a[])//输出
{
if(a[0]==0)
{
cout<<0<<endl;
return;
}
for(int i=a[0];i>0;i--)
{
cout<<a[i];
}
cout<<endl;
}
int main()
{
int i;
string s1,s2;
cin>>s1>>s2;
a[0]=s1.length();
b[0]=s2.length();
for(int i=1;i<=a[0];i++)
{
a[i]=s1[a[0]-i]-'0';
}
for(int i=1;i<=b[0];i++)
{
b[i]=s2[b[0]-i]-'0';
}
div(a,b,c);
print(c);
print(a);
return 0;
}