Java大数一些个人的见解
1.为什么要用Java大数?
在我们做题的过程中经常会遇到大数,虽然C/C++处理很快,当时写过的都知道大数不太好敲,不仅浪费时间,而且代码能力不强的人很容易出错。在没有模板的情况下我们通常会用Java里面的BigInteger
和BigDecimal
,这两个类来完成大数的计算。
2.Java大数如何操作(以BigInteger为例)
- 定义并赋值为0:
BigInteger a = new BigInteger("0");
- 用户自己赋值:
BigInteger a = cin.nextBigInteger();
[其中cin为我输入定义的变量名] - 加法运算:
a = a.add(b);
相当于a = a+b;
- 减法运算:
a = a.subtract(b);
相当于a = a-b;
- 乘法运算:
a = a.multiply(b);
相当于a = a*b;
- 除法运算:
a = a.divide(b);
相当于a = a/b;
返回商的整数部分 - 多个加法运算:
a = a.add(b).add(c);
相当于a = a+b+c;
(可类推出多个数的四则运算): - GCD(最大公约数):
a = a.gcd(b);
- mod(取模):
a = a.mod(b);
相当于a = a % b;
- 绝对值:
a = a.abs();
- 相反数:
a = a.negate();
- a的b次幂:
a = a.pow(b);
- max:
a = a.max(b);
- min:
a = a.min(b);
- 比较a和b的大小:
c = a.compareTo(b);
其中c为int型,c=-1a<b
,c=0a=b
,c=1a>b
- 判断a和b是否相等:
a = a.equal(b);
- 将大数a转换成int类型:
a = a.intValue(b);
- 将大数a转换成string类型
string ss = a.toString();
java大数中一些有用的操作
上面基本上已经实现了我们想要的基本功能,但是有一些题还是很刁钻,故意来卡你,这是会有用C++来手动模拟是一个不错的方法,但是不会很难受了。
这里来说一个我上次校赛热身赛中的一到大数题,这个大数很简单,就是要你求ab,但是a可以时小数,我们队当时就想用C++来模拟写,但是都不是很熟悉,因为我会一点java大数就来这个题了,当时最后被Java大数多于一定位数就用科学计数法来表示,而坑惨。于是赛后查了一下,处理科学记数法的办法很简单,就是先将它的后导零去掉,再将大数转换成字符串就没问题了。
题目链接
比如我现在a已经是结果了。我用string s = a.stripTrailingZeros().toPlainString();
(其中a的类型为BigDecimal)这一长段代码就是先将a的后导零去掉,然后转换成字符串。不是很明白的读者可以去查java的API里面有较详细的介绍。
- 缺陷:大数不能太长,具体多长我没有试过,但大数的长度超过105就会处理很慢超出一秒。
不信可以来试一下这个题:A==B?
总结
总的来说Java大数方便程度大于了自己敲模板,当时当大数太长,或者大数乘法的时候我们还是要老老实实的用C++来写。当时当题目限定条件不是很变态的情况下,用Java大数确实是一个很好的选择。