高精度算法总结及应用实例

本文介绍了高精度算法的基本操作,包括输入、加法、减法和乘法的实现,并提供了C语言的代码示例。此外,还讨论了高精度除法和乘法的算法,以及N!的计算方法。最后,文章提到了两个实际问题,一个是计算麦森数的最后500位数字,另一个是分解大整数的素数因子。
摘要由CSDN通过智能技术生成

 

 

#include <stdio.h>

#include <string.h>

#include <math.h>

#include <malloc.h>

int an,bn,fa=1,fb=1;         /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/

char b1[250], b2[250];           /*纪录需要计算的两个高精度数据  */

void input(int a1[],int a2[])    /*函数input为输入函数,用来纪录两个待计算的高精度数据,以数组首地址为参数.以实现返回两个高精度数据*/

{

    int i,ai=1,bi=1;

    scanf ( "%s%s", b1, b2 );                      /*输入两个高精度数据 */

    an = strlen( b1 );                             /*an纪录b1的位数 */

    bn = strlen( b2 );                            /*bn纪录b2的位数 */

    if(b1[0]==45) { an--; fa=-1;ai=0;}           /*判断数组的符号 */

    if(b2[0]==45) { bn--; fb=-1;bi=0;}

    for (i=0; i<an; i++,ai++) {a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);}     /*把字符形数据b1转为整数形数据,同样用数组纪录 */

    for (i=0; i<bn; i++,bi++) a2[i]=b2[bn-bi]-'0';    /* 同上  */

    return;

}

void addition(int a[],int b[],int q)              /*高精度加法运算*/

{

    int i,c[251]={0},k;

    if(fa*fb>0||q)

    {

        if(an>bn) k=an;

        else k=bn;                                            /*用k纪录结果的最小位数*/

        for(i=0;i<k;i++)

        {

            c[i]=a[i]+b[i]+c[i];

            c[i+1]=(int)c[i]/10;

            c[i]=(int)c[i]%10;

         }                                                 /*高精度加法运算过程*/

        if(c[k]) k++;                                     /*判断最后结果的位数*/

        if(fa<0&&q||fa<0) printf("-");

        for(i=k-1;i>=0;i--)  printf("%d",c[i]);         /*输出结果*/

        return;

    }

    else subtraction(a,b,1);

    return;

}

 

subtraction(int a[],int b[],int q)                      /*高精度减法运算*/

{

    int i,f=0,c[251]={0},k;

    if(fa*fb>0||q)

    {

        if(an>bn) k=an;

        else                                     /*用k纪录结果的最大位数*/

         { k=bn;

            for(i=k;a[i]<=b[i]&&i>=0;i--)

            if(a[i]<b[i]) f=1;                /*f纪录结果符号*/

           }

 

        if(!f)                                /*高精度减法运算过程*/

         for(i=0;i<k;i++)

         {

             if(a[i]<b[i])

             {     a[i+1]--;

                   a[i]+=10;

            }

            c[i]=a[i]-b[i];

          }

        else                                         /*当a<b时的处理*/

          for(i=0;i<k;i++)

            {

               if(b[i]<a[i])

               {   b[i+1]--;

                  b[i]+=10;

               }

               c[i]=b[i]-a[i];

             }

        while(!c[k-1]&&k>1) k--;                  /*判断最后结果的位数*/

        if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) printf("-");                      /*如果f为真是输出负号*/

        for(i=k-1;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值