java-BigInteger 从入门到入坑 完整版

本文详细介绍了Java中的BigInteger类,包括其数据范围、输入方法、构造方法、基本运算、比较大小、常量、类型转换以及二进制运算的实际应用。通过实例解析了如何处理大整数的阶乘问题,并提供了LeetCode 1808题目的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值