BigInteger 的数据范围远大于int,long。用于应对大的数据。
输入方法
nextBigInteger():控制台读入一个BigInteger型数据,类似于int型的nextInt();
//读入方法:nextBigInteger()
@Test
public void test5() {
Scanner scan = new Scanner(System.in); // 读入
int n = scan.nextInt(); // 读入一个int;
BigInteger m = scan.nextBigInteger(); // 读入一个BigInteger;
while(scan.hasNext()){
System.out.print("scan.hasNext()=" + scan.hasNext());
}
}
构造方法
默认为十进制,也是我们最常用的,同时也支持自定义进制类型(已存在的);
//进制转换
@Test
public void testScale() {
//在构造将函数时,把radix进制的字符串转化为BigInteger
String str = "1011100111";
int radix = 2;
BigInteger interNum1 = new BigInteger(str,radix); //743
//我们通常不写,则是默认成10进制转换,如下:
BigInteger interNum2 = new BigInteger(str); //1011100111
BigInteger ans=BigInteger.valueOf(1232);
}
基本运算
返回值为BigInteger类型:add(),subtract(),multiply(),divide(),mod(),remainder(),pow(),abs(),negate();
//基本运算:add(),subtract(),multiply(),divide(),mod(),remainder(),pow(),abs(),negate()
@Test
public void testBasic() {
BigInteger a = new BigInteger("13");
BigInteger b = new BigInteger("4");
int n = 3;
//1.加
BigInteger bigNum1 = a.add(b); //17
//2.减
BigInteger bigNum2 = a.subtract(b); //9
//3.乘
BigInteger bigNum3 = a.multiply(b); //52
//4.除
BigInteger bigNum4 = a.divide(b); //3
//5.取模(需 b > 0,否则出现异常:ArithmeticException("BigInteger: modulus not positive"))
BigInteger bigNum5 = a.mod(b); //1
//6.求余
BigInteger bigNum6 = a.remainder(b); //1
//7.平方(需 n >= 0,否则出现异常:ArithmeticException("Negative exponent"))
BigInteger bigNum7 = a.pow(n); n只能为int //2197
BigInteger bigaa=a.modPow(x,d) //自带的快速幂,a的x次方结果取模d
//8.取绝对值
BigInteger bigNum8 = a.abs(); //13
//9.取相反数
BigInteger bigNum9 = a.negate(); //-13
}
比较大小
compareTo()返回一个int型数据:1 大于; 0 等于; -1 小于;
max(),min():分别返回大的(小的)那个BigInteger数据;
//比较大小:compareTo(),max(),min()
@Test
BigInteger a=new BigInteger("0");
BigInteger b=new BigInteger("3");
BigInteger c=new BigInteger("6");
if(a.multiply(b)==BigInteger.ZERO) System.out.println("0");
BigInteger a=new BigInteger("2");
BigInteger b=new BigInteger("3");
BigInteger c=new BigInteger("6");//判断是否为0页可以用这个方法
if(a.multiply(b).compareTo(c)==0) System.out.println("0");
public void testCompare() {
BigInteger bigNum1 = new BigInteger("52");
BigInteger bigNum2 = new BigInteger("27");
//1.compareTo():返回一个int型数据(1 大于; 0 等于; -1 小于)
int num = bigNum1.compareTo(bigNum2); //1
//2.max():直接返回大的那个数,类型为BigInteger
// 原理:return (compareTo(val) > 0 ? this : val);
BigInteger compareMax = bigNum1.max(bigNum2); //52
//3.min():直接返回小的那个数,类型为BigInteger
// 原理:return (compareTo(val) < 0 ? this : val);
BigInteger compareMin = bigNum1.min(bigNum2); //27
}
常量
ZERO,ONE,TEN 返回值为BigInteger类型:有朋友提到的-1,2,源码注释里面已表明不再输出(Not exported.);
//常量(返回BigInteger类型)
//有朋友提到的-1和2,源码注释里面已表明不再输出(Not exported.)
@Test
public void testFinalNum() {
//0
BigInteger zero = BigInteger.ZERO;
//1
BigInteger one = BigInteger.ONE;
//10
BigInteger ten = BigInteger.TEN;
}
类型转换
将BigInteger数据转换成基本数据类型,还可以转换成radix进制的字符串形式;
//类型转换(返回类型如下)
@Test
public void testToAnother() {
BigInteger bigNum = new BigInteger("52");
int radix = 2;
//1.转换为bigNum的二进制补码形式
byte[] num1 = bigNum.toByteArray();
//2.转换为bigNum的十进制字符串形式
String num2 = bigNum.toString(); //52
//3.转换为bigNum的radix进制字符串形式
String num3 = bigNum.toString(radix); //110100
//4.将bigNum转换为int
int num4 = bigNum.intValue();
//5.将bigNum转换为long
long num5 = bigNum.longValue();
//6.将bigNum转换为float
float num6 = bigNum.floatValue();
//7.将bigNum转换为double
double num7 = bigNum.doubleValue();
}
二进制运算
返回值为BigInteger类型,此类方法不常用,有备无患;
//二进制运算(返回类型都为BigInteger,不常用,但有备无患)
@Test
public void testBinaryOperation() {
BigInteger a = new BigInteger("13");
BigInteger b = new BigInteger("2");
int n = 1;
//1.与:a&b
BigInteger bigNum1 = a.and(b); //0
//2.或:a|b
BigInteger bigNum2 = a.or(b); //15
//3.异或:a^b
BigInteger bigNum3 = a.xor(b); //15
//4.取反:~a
BigInteger bigNum4 = a.not(); //-14
//5.左移n位: (a << n)
BigInteger bigNum5 = a.shiftLeft(n); //26
//6.右移n位: (a >> n)
BigInteger bigNum6 = a.shiftRight(n); //6
}
例题:
N的阶乘:
用for或者while循环。
Scanner s=new Scanner(System.in);
BigInteger n=s.nextBigInteger();
BigInteger ans=BigInteger.ONE;
for(BigInteger i=new BigInteger("1");i.compareTo(n)<=0;i=i.add(BigInteger.ONE))
{
ans=ans.multiply(i);
}
PrintWriter pt=new PrintWriter(new OutputStreamWriter(System.out));
pt.println(ans);
pt.flush();
```java
Scanner s=new Scanner(System.in);
BigInteger n=s.nextBigInteger();
BigInteger i=BigInteger.ONE;
BigInteger ans=BigInteger.ONE;
while(i.compareTo(n)<=0)
{
ans=ans.multiply(i);
i=i.add(BigInteger.ONE);
}
PrintWriter pt=new PrintWriter(new OutputStreamWriter(System.out));
pt.println(ans);
pt.flush();
Leetcode 1808
// d
//9 4*5=20
// 3 3 3=27
// 2 2 3 2=24
//10 3 3 4=36
// 3 3 3 1=27
// 3 3 2 2 =36
//11 3 4 4=48
// 3 3 3 2=54
// 0 3的shang
//prime%3 1 3的shang1 *4
// 2 3的shang *2
if(primeFactors==1) return 1;
BigInteger maxx=new BigInteger("1000000007");
BigInteger x=BigInteger.valueOf(primeFactors);
//BigInteger yu=x.mod(new BigInteger("3"));
BigInteger shang=x.divide(new BigInteger("3"));
BigInteger three=new BigInteger("3");
if(primeFactors%3==0) return Integer.parseInt(three.modPow(shang,maxx).toString());
if(primeFactors%3==1)
return Integer.parseInt(three.modPow(shang.subtract(BigInteger.ONE),maxx).
multiply(new BigInteger("4")).mod(maxx).toString());
return Integer.parseInt(three.modPow(shang,maxx).multiply
(new BigInteger("2")).mod(maxx).toString());