Java大数——BigInteger

BigInteger

int类型的最大值为 2 3 1 − 1 2^31-1 2311,Java的long和C++的long long一样——最大值 2 6 3 − 1 2^63-1 2631,如果要实现一个更大的数,C++需要字符串来存储数字的大数,但是实现过于麻烦,Java给我们封装实现了BigInteger(实现原理

创建对象

常用构造方法:

BigInteger b=new BigInteger(String val);

静态初始化方法:

BigInteger b=BigInteger.valueOf(100);

读入BigInteger:

Scanner in=new Scanner(System.in);
BigInteger b=in.nextBigInteger();
运算

加减乘除

 BigInteger a = new BigInteger("4");
 BigInteger b = new BigInteger("2");
 BigInteger c;
1.:
 c=a.add(b);    //  6
2.:
 c=a.subtract(b);   //  2
3.:
 c=a.multiply(b);  //  8
4. 除
 c=a.divide(b);    //  2

取模、求幂、取绝对值、取相反数、求最大公因数

 BigInteger a = new BigInteger("9");
 BigInteger b = new BigInteger("-2");
 BigInteger c;
1. 取相反数:
 b=b.negate();    //  2
2. 取模:
 c=a.mod(b);   //  1   (或者使用a.reminder(b)求余,但注意:当a和b符号一致时,求模运算和求余运算所得的c的值一致。但当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致)
3. 取绝对值:
 c=a.abs();  //  9
4. 求n次幂(只能传入int类型的数值)
 int n=3;
 c=a.pow(n);    //  729
5. 求两个大数的最大公因数
 BigInteger b1 = new BigInteger("36");
 BigInteger b2 = new BigInteger("12");
 b1=b1.gcd(b2);    //  12

二进制运算

 int n=1;
 BigInteger a = new BigInteger("13");
 BigInteger b = new BigInteger("2");
 BigInteger c;
1.:
 b=b.and(a);    //  0
2.:
 c=a.or(b);   //  15   
3. 异或:
 c=a.xor();  //  15
4. 取反
 c=a.not();    //  -14
5. 左移n位
 c=a.shiftLeft(n);     //  26
6. 右移n位
 c=a.shiftRight(n);    //  6
三、比较

compareTo

compareTo(BigInteger val)返回一个int型数据:1—大于; 0—等于; -1—小于;

 BigInteger a = new BigInteger("13");
 BigInteger b = new BigInteger("2");
 int num=a.compareTo(b);   //  1

max、min

max(BigInteger val),min(BigInteger val):分别返回大的(小的)那个BigInteger数据;

 BigInteger a = new BigInteger("13");
 BigInteger b = new BigInteger("2");
 BigInteger c = a.max(b);  //  13
 c=a.min(b);   //  2
常量

ONE、TEN、ZERO:

BigInteger one = BigInteger.ONE;
BigInteger zero = BigInteger.ZERO;
BigInteger one = BigInteger.TEN;
类型转换

将BigInteger转换为基本数据类型

 BigInteger b = BigInteger.valueof(25);
 1. 转换为String
 String string = b.toString();    //"25"
 2. 转换为int
 int num1=b.intValue();    //  25
 3. 转换为long
 long num2=b.longValue();  //  25
 4. 转换为float
 float num3=b.floatValue();    //  25.0
 5. 转换为double
 double num4=b.doubleValue();  //  25.0
重要方法

isProbablePrime(int certainty)

如果该 BigInteger 可能是素数,则返回 true ;如果它很明确是一个合数,则返回 false 。 参数 certainty 是对调用者愿意忍受的不确定性的度量:如果该数是素数的概率超过了 1 - 1/2*certainty方法,则该方法返回 true 。执行时间正比于参数确定性的值。

isProbablePrime函数是针对BigInteger类的一个素数判断函数,它的实现原理其实并不复杂,但是要求掌握的数论知识面挺广,要分许多情况讨论,要用到Miller-Rabin素数测试和Lucas-Lehmer测试,它是一个概率算法,返回的结果:一个数不是素数或者一个数可能是素数。

Scanner in = new Scanner(System.in);
BigInteger b;
b = in.nextBigInteger();
if(x.isProbablePrime(50))  //相当于该数是素数的概率超过99%
	System.out.println("Yes");
else
	System.out.println("No");
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值