zoukankan      html  css  js  c++  java
  • 高精度数加减运算

    使用字符串读入数据

    定义高精度数类型

    #define MAXLEN 3000
    typedef struct
    {
         int sign;      //0正 1负
        int ni;             //整数长度
         int a[MAXLEN];//整数数字
         int nd;            //小数长度
         int d[MAXLEN];//小数数字
    }BIGFLOAT;
    

      

    void assign(int sign, char s[], BIGFLOAT *x)
    {
        int i,ip,m,c;
        for(i=0;i<MAXLEN;i++) x->a[i]=0;
        for(i=0;i<MAXLEN;i++) x->d[i]=0;
        x->sign = sign;
        m = strlen(s);
        ip = m;
        for(i=0;i<m;i++)
        {
             if(s[i]=='.') ip=i;
        }
        for(i=ip-1;i>=0;i--)
        {
             c=s[i]-'0';
             if(c>=0&&c<=9)
                  x->a[ip-1-i]=c;
        }
        for(i=ip+1;i<m;i++)
        {
             c=s[i]-'0';
             if(c>=0&&c<=9)
                  x->d[x->nd-(i-ip)]=c;
        }
    }
    

     

    void add(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)
    {
        int i,s,carry=0;
        c->ni = a.ni;                 //
        c->nd = a.nd;               //
        for(i=0;i<c->nd;i++)
        {
             s=carry+a.d[i]+b.d[i];
             c->d[i]=s%10;
             carry=s/10;
        }
         //进行整数部分的加法计算
        for(i=0;i<c->ni;i++)
        {
             s=carry+a.a[i]+b.a[i]; //本位加上进位
             c->a[i] = s%10;          //计算整数部分本位数字
             carry = s/10;               //计算进位
        }
    }
    

      

    void sub(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)
    {
        int i;
        c->ni=a.ni;
        c->nd=a.nd;
        //进行小数部分的减法计算
        for(i=0;i<c->nd;i++)
        {
            if(b.d[i]>a.d[i])                           //判断减数是否大于被减数
            {
                 if(i+1==c->nd) a.a[0] -=1;    //向整数部分 借位
                 else  a.d[i+1] -=1;                //向高位借位
                 a.d[i] +=10;                         //借位后,本位加上进位基数
            }
            c->d[i]=a.d[i]-b.d[i];                  //同位数字相减
        }
        //进行整数部分的减法计算
        for(i=0;i<c->ni;i++)
        {
             if(b.a[i]>a.a[i])
             {
                  a.a[i+1]-=1;
                  a.a[i]+=10;
              }
             c->a[i]=a.a[i]-b.a[i];
        }
    }
    

      

    void sum(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)     //高精度加法和减法混合计算函数
    {
        int sign;
        if(a.sign == b.sign)
        {
             c->sign = a.sign;
             add(a,b,c);
        }
        else
        {
            sign = compare(a,b);                    //1负,0正
          if(sign==0)                                   //a 的绝对值大于b的绝对值
             {
                 c->sign=a.sign;                        //和的变量符号与绝对值的相同
                 sub(a,b,c);                               //绝对值大的数减去小的数
             }
              else
              {
                    c->sign = b.sign;                   //和的变量符号与绝对值的相同
                    sub(b,a,c);                            //绝对值大的数减去小的数                
              }
        }
    }
    
    //比较两个浮点数绝对值的大小
    int compare(BIGFLOAT a, BIGFLOAT b)
    {
        int i;
        for(i=a.ni-1;i>=0;i--)
      {
          if(b.a[i]>a.a[i]) return 1;               //后者大于前者
          if(b.a[i]<a.a[i]) return 0;
      }
       for(i=a.nd-1;i>=0;i--)                        //若整数部分相等,则比较小数部分
             if(b.d[i]>a.d[i])   return 1;
    
        return 0;
    }
    

      

     

  • 相关阅读:
    java BufferedImage 合成多张图片
    JQ 输入框控制输入
    SpringBoot读取静态资源文件
    Java获取永久图文素材中的网页端Url
    生成随机32位Token43位asekey
    SQL语句模糊查询年月
    go语言学习笔记3----流程控制
    go语言学习笔记2----变量、常量
    go语言学习笔记1----数据类型
    kettle抽取数据判断是否有数据
  • 原文地址:https://www.cnblogs.com/Daywei/p/2382281.html
Copyright © 2011-2022 走看看