高精除低精

#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位为止。

原文地址:https://www.cnblogs.com/peppa/p/8538354.html