高精除低精
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
char a[100005],b[100005];
int aa[100005],cc[100005],lena,lenc,b,i,x;
memset(aa,0,sizeof(aa));
memset(cc,0,sizeof(cc));
gets(a);//输入被除数
scanf("%d",&b);//输入除数
lena = strlen(a);
for(i = 0;i <= lena - 1;i++)aa[lena + 1] = a[i] - 48;
x = 0;
for(i = 1;i <= lena;i++)
{
c[i] = (x * 10 + a[i]) / b;
x = (x * 10 + a[i]) % b;
}
lenc = 1;
while(c[lenc] == 0 && lenc < lena) lenc++;
for(i = lenc;i <= lena;i++)printf("%d",c[i]);
printf(".");
for(i = 1;i <= 500;i++)
{
x*=10;
printf("%d",x/b);
x%=b;
}
return 0;
}
这段代码的红色部分是核心所在。首先,举一个例子:12345/34 a[1]=1;a[2]=2;a[3]=3;a[4]=4;a[5]=5.b=34
I=1.c[1]=(0+1)/34 =0.x=(0+1)%34=1
I=2.c[2]=(10+2)/34=0.x=(10+2)%34=12
I=3.c[3]=(120+3)/34=3.x=(120+3)%34=21.
I=4.c[4]=(210+4)/34=6.x=(210+4)%34=10.
I=5.c[5]=(100+5)/34=3.x=(100+5)%34=3.
......
此时得到的结果为00363...其中363便是12345/34的整数部分,而x最后的值3则是12345%34的值。这样的方法叫做按位相除法。
接着看蓝色部分,这是对小数进行的处理与输出。现在余数x=3
I=1
X=x*10=30 x/b=30/34=0 x=x%b=30%34=30
I=2
X=x*10=300.x/b=300/34=8.x=x%b=300%34=28
I=3
X=x*10=280x/b=280/34=8.x=x%b=280%34=8
I=4
X=x*10=80.x/b=80/34=2.x=x%b=80%34=12...
现在得到小数部分0882.......
通过每次对余数进行“填0”操作,达到能够除以除数的目的,反复操作,直到小数部分够500位为止。