• 高精除低精


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

  • 相关阅读:
    mysql
    Spring MVC
    springSecurity
    导出Excel报表
    Redis集群搭建
    Oracle 分析数据库表行长度的统计信息 使用聚簇的步骤
    Dbms.job 学习
    oracel 学习系列
    Oracle 工具类 Sql 分析索引的 碎片率
    oracl
  • 原文地址:https://www.cnblogs.com/peppa/p/8538354.html
Copyright © 2020-2023  润新知