zoukankan      html  css  js  c++  java
  • 大数(高精度)加减乘除

    C++版:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    using namespace std;
    
    
    const int power = 4;      //每次运算的位数为10的power次方,在这里定义为了方便程序实现  
    const int base = 10000;      //10的power次方。  
    
    
    //要压位的时候,只需改power 和 base即可,如压万位高精,那么power = 4, base = 10000  
    
    
    const int MAXL = 10001;    //数组的长度。  
    
    
    char a[MAXL], b[MAXL], aa[MAXL];  
    struct num  
    {  
        int a[MAXL];  
        num() { memset(a, 0, sizeof(a)); }                      //初始化  
        num(char *s)                                            //将一个字符串初始化为高精度数  
        {  
            memset(a, 0, sizeof(a));  
            int len = strlen(s);  
            a[0] = (len+power-1) / power;                       //数的长度  
            for (int i=0, t=0, w; i < len ;w *= 10, ++i)          
            {  
                if (i % power == 0) { w = 1, ++t; }  
                a[t] += w * (s[i]-'0');  
            }  
            //初始化数组,这里自己模拟一下,应该很容易懂的~  
        }  
        void add(int k) { if (k || a[0]) a[ ++a[0] ] = k; }     //在末尾添加一个数,除法的时候要用到  
        void re() { reverse(a+1, a+a[0]+1); }                   //把数反过来,除法的时候要用到  
        void print()                                            //打印此高精度数  
        {  
            printf("%d", a[ a[0] ]);        
            //先打印最高位,为了压位 或者 该高精度数为0 考虑  
            for (int i = a[0]-1;i > 0;--i)  
            printf("%0*d", power, a[i]);    
            //这里"%0*d", power的意思是,必须输出power位,不够则前面用0补足  
            printf("
    ");  
        }  
    } p,q,ans,r;  
    
    
    bool operator < (const num &p, const num &q)              //判断小于关系,除法的时候有用  
    {  
        if (p.a[0] < q.a[0]) return true;  
        if (p.a[0] > q.a[0]) return false;  
        for (int i = p.a[0];i > 0;--i)  
        {  
            if (p.a[i] != q.a[i]) return p.a[i] < q.a[i];  
        }  
        return false;  
    }  
    
    
    num operator + (const num &p, const num &q)               //加法,不用多说了吧,模拟一遍,很容易懂  
    {  
        num c;  
        c.a[0] = max(p.a[0], q.a[0]);  
        for (int i = 1;i <= c.a[0];++i)  
        {  
            c.a[i] += p.a[i] + q.a[i];  
            c.a[i+1] += c.a[i] / base;  
            c.a[i] %= base;  
        }  
        if (c.a[ c.a[0]+1 ]) ++c.a[0];  
        return c;  
    }  
    
    
    num operator - (const num &p, const num &q)               //减法,也不用多说,模拟一遍,很容易懂  
    {  
        num c = p;  
        for (int i = 1;i <= c.a[0];++i)  
        {  
            c.a[i] -= q.a[i];  
            if (c.a[i] < 0) { c.a[i] += base; --c.a[i+1]; }  
        }  
        while (c.a[0] > 0 && !c.a[ c.a[0] ]) --c.a[0];            
        //我的习惯是如果该数为0,那么他的长度也是0,方便比较大小和在末尾添加数时的判断。  
        return c;  
    }  
    
    
    num operator * (const num &p, const num &q)                   
    //乘法,还是模拟一遍。。其实高精度就是模拟人工四则运算!  
    {  
        num c;  
        c.a[0] = p.a[0]+q.a[0]-1;  
        for (int i = 1;i <= p.a[0];++i)  
        for (int j = 1;j <= q.a[0];++j)  
        {  
            c.a[i+j-1] += p.a[i]*q.a[j];  
            c.a[i+j] += c.a[i+j-1] / base;  
            c.a[i+j-1] %= base;  
        }  
        if (c.a[ c.a[0]+1 ]) ++c.a[0];  
        return c;  
    }  
    
    
    num operator / (const num &p, const num &q)               //除法,这里我稍微讲解一下  
    {  
        num x, y;  
        for (int i = p.a[0];i >= 1;--i)                       //从最高位开始取数  
        {  
            y.add(p.a[i]);             //把数添到末尾(最低位),这时候是高位在前,低位在后  
            y.re();                    //把数反过来,变为统一的存储方式:低位在前,高位在后  
            while ( !(y < q) )         //大于等于除数的时候,如果小于的话,其实答案上的该位就是初始的“0”  
                y = y - q, ++x.a[i];   //看能减几个除数,减几次,答案上该位就加几次。  
            y.re();                    //将数反过来,为下一次添数做准备  
        }  
        x.a[0] = p.a[0];  
        while (x.a[0] > 0 && !x.a[x.a[0]]) --x.a[0];  
        return x;  
    }  
    
    
    int main()  
    {  
        while (true)
        {char flag1=getchar();
         if (flag1=='0') break;
         scanf("%s",&a);
         char flag2=getchar();
         while (flag2==' ') flag2=getchar();
         scanf("%s
    ",&b);
         memset(aa,0,sizeof(aa));
         aa[0]='0';
         //cout<<a<<" "<<b<<endl;
         reverse(a,a+strlen(a));
         reverse(b,b+strlen(b));
         reverse(aa,aa+strlen(aa));
         p=num(a);
         q=num(b);
         r=num(aa);
         if (flag1=='+'&&flag2=='+')
         {if (q<p)
          {ans=p-q;
           ans.print();
           } else
          {ans=q-p;
           if (r<ans)
           printf("-");
           ans.print();
           }
          }
          else if (flag1=='+'&&flag2=='-')
          {ans=p+q;
           ans.print();
           } else if (flag1=='-'&&flag2=='+')
          {ans=p+q;
           if (r<ans)
           printf("-");
           ans.print();
           } else
          {if (q<p)
           {ans=p-q;
        if (r<ans)
        printf("-");
        ans.print();
            } else
           {ans=q-p;
        ans.print();
            }
           }
          }
       return 0;
    }

    JAVA版:

    http://blog.csdn.net/Fire_to_cheat_/article/details/79540423

    import java.util.Scanner;  
    import java.math.*;  
    import java.text.*;  
    
    public class Main {  
        public static void main(String args[]) {  
            Scanner cin = new Scanner(System.in);  
            BigInteger a, b;  
            int c;  
            char op;  
            String s;  
            while (cin.hasNext()) {  
                a = cin.nextBigInteger();  
                s = cin.next();  
                op = s.charAt(0);  
                if (op == '+') {  
                    b = cin.nextBigInteger();  
                    System.out.println(a.add(b));  
                } else if (op == '-') {  
                    b = cin.nextBigInteger();  
                    System.out.println(a.subtract(b));  
                } else if (op == '*') {  
                    b = cin.nextBigInteger();  
                    System.out.println(a.multiply(b));  
                } else {  
                    BigDecimal a1, b1, eps;  
                    // 浮点数  
                    String s1, s2, temp;  
                    s1 = a.toString();  
                    a1 = new BigDecimal(s1);  
                    b = cin.nextBigInteger();  
                    s2 = b.toString();  
                    b1 = new BigDecimal(s2);  
                    c = cin.nextInt();  
                    // 接收精度控制,即保留几位小数的问题  
                    eps = a1.divide(b1, c, 4);  
                    if (c != 0) {  
                        temp = "0.";  
                        for (int i = 0; i < c; i++)  
                            temp += "0";  
                        DecimalFormat gd = new DecimalFormat(temp);  
                        System.out.println(gd.format(eps));  
                    } else  
                        System.out.println(eps);  
                }  
            }  
        }  
    }  
  • 相关阅读:
    jQuery选择器总结
    HTML页面跳转的5种方法
    与孩子共情就是这么简单!
    C#中使用OracleTransaction
    如何查看Mysql服务器上的版本
    使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题
    使用docker搭建hadoop环境,并配置伪分布式模式
    Hadoop安装教程【转】
    PHP+Hadoop+Hive+Thrift+Mysql实现数据统计分析
    《阿里巴巴 Java 开发手册》划重点!
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9386998.html
Copyright © 2011-2022 走看看