发现高精度除高精度的博客比较少,我来写了一个。
大家可以参考:
//高精度除高精度
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int a[100001],b[100001],ans[100001],la,lb,lans,i,j,k;
//a:被除数,b:除数,ans:商
//la;被除数长度,lb:除数长度,lans:商长度
//i,j,k循环用的
string s1,s2;
int main()
{
cin>>s1>>s2;
la=s1.size();
lb=s2.size();
for( i=1;i<=la;i++)
{
a[i]=s1[i-1]-'0';//将字符串转换为数组,除法是正方向的,加减乘为反方向;
}
for(i=1;i<=lb;i++)
{
b[i]=s2[i-1]-'0';
}
if(la<lb)//如果被除数比除数的长度短,直接输出0
{
printf("0");
return 0;
}
if(la==lb)//如果长度一样,若被除数较小,同样输出0
{
for( i=1;i<=la;i++)
{
if(a[i]<b[i])
{
printf("0");
return 0;
}
else
{
if(a[i]>b[i])
break;
}
}
}
lans=la-lb+1;
//把除法转换成减法,不停地减,每减一次,对应位置的答案加一
for(i=1;i<=lans;i++)
{
while(1)
{
for(j=i,k=1;j<=lb+i-1,k<=lb;j++,k++)//遍历
{
if(a[j]>b[k])//如果被除数的某位置先比除数大了,则可以做减法,跳出循环
{
j=lb+1;
break;
}
else
if(a[j]<b[k])//如果被除数的某位置先比除数小了,则不可做减法,跳出循环
break;
}
//两数相同
if(j>lb)
{
for(j=lb+i-1,k=lb;j>=i,k>=1;j--,k--)//减法是反方向遍历
{
if(a[j]-b[k]>=0)
{
a[j]-=b[k];
}
else
{
a[j]+=10;//向前面借一;
a[j-1]--;
a[j]-=b[k];
}
}
ans[i]++;
}
else//如果不能做减法
{
a[i+1]+=a[i]*10;//将最前一位的所有数全部退到下一位置的数上(与做减法相同,可以自己试试)
a[i]=0;
break;
}
}
}
for(int i=1;i<=lans;i++)
{
if(i==1&&ans[i]==0);//当第一位是0,不输出
else
printf("%d",ans[i]);
}
return 0;
}