怎么用C语言代码实现超高精度的大数据除法运算?要求结果保留到小数点后有两位

Python010

怎么用C语言代码实现超高精度的大数据除法运算?要求结果保留到小数点后有两位,第1张

#include <stdio.h>

#include <string.h>

#define MAX_LEN 200

char a[MAX_LEN + 10]

char b[MAX_LEN + 10]

int va[MAX_LEN + 10] //被除数, an1[0]对应于个位

int vb[MAX_LEN + 10] //除数, an2[0]对应于个位

int vc[MAX_LEN + 10] //存放商,aResult[0]对应于个位

//长度为 nLen1 的大整数p1 减去长度为nLen2 的大整数p2

//结果放在p1 里,返回值代表结果的长度

//如不够减返回-1,正好减完返回 0

 //下面判断p1 是否比p2 大,如果不是,返回-1

int Substract( int * p1, int * p2, int nLen1, int nLen2)

{

    int i

    if( nLen1 < nLen2 )

        return -1

    if( nLen1 == nLen2 )

    {

        for( i = nLen1-1 i >= 0 i -- )

        {

            if( p1[i] > p2[i] )           break //p1>p2

            else if( p1[i] < p2[i] )   return -1 //p1<p2

        }

    }

    for( i = 0 i < nLen1 i ++ )

    { //要求调用本函数确保当i>=nLen2 时,p2[i] = 0

        p1[i] -= p2[i]

        if( p1[i] < 0 )

        {

            p1[i]+=10

            p1[i+1] --

        }

    }

    for( i = nLen1 -1  i >= 0  i-- )

        if( p1[i] )//找到最高位第一个不为0

            return i + 1

    return 0//全部为0,说明两者相等

}

int main()

{

    freopen("test.txt","r",stdin)

    int test

    scanf("%d",&test)

    while(test--){

        scanf("%s", a)

        scanf("%s", b)

        int i, j

        int lena = strlen(a)

        memset( va, 0, sizeof(va))

        memset( vb, 0, sizeof(vb))

        memset(vc, 0, sizeof(vc))

        for( j = 0, i = lena - 1i >= 0  i --)

            va[j++] = a[i] - '0'

        int lenb = strlen(b)

        for( j = 0, i = lenb - 1i >= 0  i --)

            vb[j++] = b[i] - '0'

        if( lena < lenb )

        {

            printf("0\n")

            continue

        }

        int nTimes = lena - lenb

        if(nTimes > 0)

        {

            for( i = lena -1 i >= nTimes i -- )

                vb[i] = vb[i-nTimes]//朝高位移动

            for(  i >= 0 i--)//低位补0

                vb[i] = 0

            lenb = lena

        }

        for( j = 0  j <= nTimes j ++ )

        {

            int nTmp

            //一直减到不够减为止

            //先减去若干个 an2×(10 的 nTimes 次方),

            //不够减了,再减去若干个 an2×(10 的 nTimes-1 次方),......

            while( (nTmp = Substract(va, vb+j, lena, lenb-j)) >= 0)

            {

                lena = nTmp

                vc[nTimes-j]++ //每成功减一次,则将商的相应位加1

            }

        }

              //下面输出结果,先跳过高位0

        for( i = MAX_LEN  (i >= 0) && (vc[i] == 0) i -- )

        if( i >= 0)

            for(  i>=0 i--)

                printf("%d", vc[i])

        else

            printf("0")

        printf("\n")

    }

    return 0

}

#include<stdio.h>

int main()

{ double a,b,c

while(scanf("%lf%lf",&a,&b)==2)

{ c=a/b

  printf("%g/%g=%g\n",a,b,c)

}

return 0

}

在超高精度算法中,最难的就是除法了。(乘法,加法,减法,都要会)

模拟人工算法吧(大数都采用字符数组!)

做除法运算,首先至少要会乘法。

123456789*5

运算如下:

9*5=5进4,5*8=0

加个位进位4

进4,以此类推

大数之间的比较,也要会,这个简单就不说了,如果这个也不会,那我没办法说下去了!

除法如下:

把数字当放入字符数组....

假设:17346777412563/2365489

2365489(7位)

1734677(7位)

使用字符数组比较,如果是小于,那么采用17346777(8位)

一.然后2365489*9=的结果跟17346777,如果大于就2365489*8....依次类推直到小于。求得结果的第一位了。

然后17346777-2365489*x=余数跟(17346777后一位)4组合,看是否大于2365489,大于就

进入一步骤方式运算。小于的话,结果的第二位就是0。

大致思路讲了,只要中间思路分析清楚,基本上不会有多大问题。总之,模拟人工。

这样的话,不管多大的数字之间的除法都OK的!

思路不懂可以来问我,如果,要我写代码,就别找我了