Java大数一些个人的见解

Java大数一些个人的见解


1.为什么要用Java大数?

在我们做题的过程中经常会遇到大数,虽然C/C++处理很快,当时写过的都知道大数不太好敲,不仅浪费时间,而且代码能力不强的人很容易出错。在没有模板的情况下我们通常会用Java里面的BigIntegerBigDecimal,这两个类来完成大数的计算。

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大数确实是一个很好的选择。

参考资料与博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值