zoukankan      html  css  js  c++  java
  • Java 实现大数算法

    转自大佬博客  https://blog.csdn.net/Akatsuki__Itachi/article/details/81152232

    在ACM竞赛里难免会遇到一些大数(即超大数字!)的问题,但是对于ACMers来说,彼时还没有学过java,只会敲一手C/C++(比如我的大一),这篇博客就简单讲一下用java来实现大数的相关操作

    关于eclipse的使用,这里也捎带一提。

    配置了jdk并安装好eclipse之后(什么?怎么配置jdk?当然要点这里了!(ubuntu系统))

    进入到eclipse界面

    第一步:file->new->java project->起名->finish

    第二步:进入到刚才建的工程里,右键src->new->package->起名->finish

    第三步:进入到刚才建的package里,右键name->new->class->起名(这里起名要注意,因为比赛时如果交java代码,这里的类名就要命名为Main,区分大小写
     

    下面就开始写我们的代码了

    先从最简单的来说:

    1.输出hello world

    package BigInteger;
    public class Main {
        public static void main(String args[]) {
            System.out.println("Hello world");
        }
    }

    关于上面的package BigInteger,提交代码时不需要粘贴。

    2.计算a+b

    package BigInteger;
    import java.util.*;//导包,相当于c/c++里的头文件
    public class Main {
        public static void main(String args[]) {
    
            Scanner cin = new Scanner(System.in);
    
            int a,b;
            a = cin.nextInt();
            b=cin.nextInt();
            int ans = a + b;
            System.out.println(ans);
        }
    }

    3.多组输入 a b

    package BigInteger;
    import java.util.*;
    public class Main {
        public static void main(String args[]) {
    
            Scanner cin = new Scanner(System.in);
    
            int a,b;
            while(cin.hasNext()) {
                a=cin.nextInt();
                b=cin.nextInt();
                int ans=a+b;
                System.out.println(ans);
            }
        }
    }

    下面就开始说大数的相关操作

    首先我们需要导包,即BigIntegr类 和 BigDecimal类所在的包

    import java,math.*;

    *就代表导入包math里面所有的类,如果你不喜欢看到 *

    那么你也可以写 import java,math.BigInteger; import java,math.BigDecimal;

    1.大整数的加减乘除求余计算

    package BigInteger;
    import java.util.*;
    import java.math.*;
    public class Main {
        public static void main(String args[]) {
    
            Scanner cin = new Scanner(System.in);
    
            BigInteger a , b;
            a=cin.nextBigInteger();
            b=cin.nextBigInteger();
    
            BigInteger ans_add,ans_sub,ans_mul,ans_div,ans_mod;
    
            ans_add = a.add(b); //a+b
            ans_sub = a.subtract(b); //a-b
            ans_mul = a.multiply(b); //a*b
            ans_div = a.divide(b); //a/b
            ans_mod = a.mod(b); //a%b
            System.out.println("a + b = "+ans_add);
            System.out.println("a - b = "+ans_sub);
            System.out.println("a * b = "+ans_mul);
            System.out.println("a / b = "+ans_div);
            System.out.println("a % b = "+ans_mod);
    
        }
    }

    运行结果如下:

    下面举个求阶乘的例子:

    package BigInteger;
    import java.util.*;
    import java.math.*;
    public class Main {
    
        public static BigInteger factorial(BigInteger n){  
                BigInteger bd1 = new BigInteger("1");
                BigInteger bd2 = new BigInteger("2");
                BigInteger result = bd1;
                while(n.compareTo(bd1) > 0){
                        result = result.multiply(n);  
                        n = n.subtract(bd1); 
                }   
                return result;   
            }  
    
        public static void main(String args[]) {
    
            Scanner cin = new Scanner(System.in);
    
            BigInteger n;
            n=cin.nextBigInteger();
    
            BigInteger ans;
            ans = factorial(n);
            System.out.println("n的阶乘为: "+ans);
    
        }
    }

    关于BigDecimal的用法大致上和BigInteger一样。

    不过这里需要提一下,在进行大浮点数运算的时候,小数点后面可能会含有多余的后导0

    比如0.5000,在题目要求中可能只需要输出0.5

    当然,有的题目可能还会要求小数点前面的0也要去掉,输入.5

    这时候我们就需要去除掉后导0

    转化成 字符型的

    方法如下:

    String str;
    str=ans.stripTrailingZeros().toPlainString();//去除所有后导0,并且转化成字符型
    //ans为大浮点数运算后得到的答案
    //如果小数点前面的0也需要去掉,那么输出的时候处理一下即可:
    if(str.charAt(0)=='0')
            System.out.println(str.substring(1));
    else
            System.out.println(str);

    具体题目见这里!

  • 相关阅读:
    宏定义中的#
    HDU1506 Largest Rectangle in a Histogram 动态规划
    HDU1864 最大报销额 DP
    POJ2771 Guardian of Decency 最大独立子集
    POJ1698 Alice's Chance 最大流
    HDU1003 Max Sum 动态规划
    eval格式化事件类型的字符串
    C#虚方法virtual详解
    c# 利用反射获得某个类或者对象的所有属性
    windows服务的通常写法
  • 原文地址:https://www.cnblogs.com/zcy19990813/p/9702743.html
Copyright © 2011-2022 走看看