java大数运用 - CSDN博客
java 大数的运用
上周参加了icpc的邀请赛,遇到了大数。哎,没想过会出,模板完全没用过,写个大数吧。
对大数的认知:
首先大数在java中是一个独立的类,这个类可以说是对计算机数据类型(具有最大最小值)的扩充,在这个类里只要不超过内存限制,可以有无限位。
大数有BigInteger和BigDecimal两类,前者能存整数,后者能存小数。BigDecimal的实现利用到了BigInteger,但是,由于BigDecimal的使用性更好(详情请往下看),因此我推荐大家用BigDecimal类型。这两个类在java.math.BigInteger和java.math.BigDecimal中;但是,由于我们可能会用到math中的许多类,我们也可以用一个简单的*代表导入所有类,既java.math.*;
具体的实现:
1.首先是对于大数的创建:
大数具有接受String类型参数的构造函数:public BigInteger(String val);
BigInteger m = new BigInteger("10");
另外,在大数中是不能像一般数那样用运算法的,因此不能把整数赋值给大数的话要调用valueOf(double long)(在BigDecimal中是double类型)的静态方法
m = BigInteger.valueOf(c);
对于大数的输入,和一般数一样创建Scanner对象,然后输入时会有一个nextInteger()方法,别忘了导入包
Scanner input= new Scanner(System.in);
m = input.nextBigInteger();
*注意:BigDecimal构造方法的参数基本上都可以用,整数,小数,字符串,包括BigInteger。
2.对大数进行数学运算
加法:add方法
BigInteger m = new BigInteger("200");
BigInteger n = new BigInteger("12");
m=m.add(n);
减法:subtract方法
m=m.subtract(n);
乘法:multiply方法
m=m.multiply(n);
除法:divide方法返回的类型和调用者的类型相同
m=m.divide(n);
比较大小:int m.compareTo(n);如果m>n返回1,m<n,返回-1,相等为0;
int c;
c=m.compareTo(n);
3.(扩展)大数的舍入模式补充(BigDecimal除法运算扩展)
具体的divide如下.divide(BigDecimal val,int scale,RoundingMode ruundingMode)
*注意BigInteger没有
1.第二个参数值的是保留小数点后多少位
2.第三个参数舍入模式:
0 (int类型)没错就是零和BigDecimal.ROUND_UP想等。既如果后面以为大于0就进一位
1 和BigDecimal.ROUND_DOWN相等。舍掉后面的数
BigDecimal.ROUND_CEILING既如果是正数,按ROUND_UP处理负数,按ROUND_DOWN处理。
BigDecimal.ROUND_HALF_UP既我们学的四舍五入法。
java中还有一些其他的舍入模式,不过不常用。因此,不在累述。