Java大数运算之BigInteger

1984 字
5 分钟

每日一言

Fight with all your might. With those young kids, give your mind and heart a solid workout. Let your heart, which had dried up and gotten stiff, beat once more. — Yoake Ryou from ReLIFE

BigInteger

BigInteger 是 java.math 包下的一个类,它提供了一种表示任意大小的整数的方式。理论上它可以表示的整数的大小只受限于你电脑内存的大小。

BigIntger的特性

  • 不可变性:这点与String类型非常相似,当一个BigInteger类型创建后其内部表示的数值就不能被改变,所有对 BigeInteger 对象进行运算的方法(如加、减、乘、除)都不会修改原始对象,而是会返回一个新的包含运算结果的 BigInteger 对象。
  • 基于对象BigInteger 是一个类,因此它的实例是对象。
  • 方法运算:不能直接使用标准的运算符(+, -, *, /, %)对 BigInteger 对象进行运算。必须调用它提供的相应方法。

如何创建BigInteger

首先需要引包:

import java.math.BigInteger;

然后可以通过如下两种方式创建实例:

  1. 对于很大的数,传入String类型
BigInteger a = new BigInteger("1234567890121312432432543543");
  1. 对于可以用long表示的数:可以直接传入数字类型
BigInteger b = new BigInteger(123);

BigInteger运算

BigInteger类提供了丰富的数学运算方法,以下表格列出了常用的运算方法:

运算方法描述示例
加法add(BigInteger val)返回this + val的结果a.add(b)
减法subtract(BigInteger val)返回this - val的结果a.subtract(b)
乘法multiply(BigInteger val)返回this × val的结果a.multiply(b)
除法divide(BigInteger val)返回this ÷ val的商a.divide(b)
余数remainder(BigInteger val)返回this ÷ val的余数a.remainder(b)
取模mod(BigInteger m)返回this模m的结果a.mod(b)
除法和余数divideAndRemainder(BigInteger val)返回包含商和余数的数组a.divideAndRemainder(b)
幂运算pow(int exponent)返回this的exponent次方a.pow(3)
比较compareTo(BigInteger val)比较两个数的大小a.compareTo(b)
最大值max(BigInteger val)返回较大的数a.max(b)
最小值min(BigInteger val)返回较小的数a.min(b)
绝对值abs()返回绝对值a.abs()
相反数negate()返回相反数a.negate()
符号值signum()返回符号值(1, 0, -1)a.signum()
位移shiftLeft(int n), shiftRight(int n)返回左/右移n位的结果a.shiftLeft(2)
与运算and(BigInteger val)返回按位与的结果a.and(b)
或运算or(BigInteger val)返回按位或的结果a.or(b)
异或运算xor(BigInteger val)返回按位异或的结果a.xor(b)
取反not()返回按位取反的结果a.not()

使用示例

import java.math.BigInteger;

public class BigIntegerExample {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("123456789012345678901234567890");
        BigInteger b = new BigInteger("98765432109876543210");

        // 加法运算
        BigInteger sum = a.add(b);
        System.out.println("加法结果: " + sum);

        // 乘法运算
        BigInteger product = a.multiply(b);
        System.out.println("乘法结果: " + product);

        // 比较大小
        if (a.compareTo(b) > 0) {
            System.out.println("a 大于 b");
        }
      
        // 幂运算
        BigInteger squared = a.pow(2);
        System.out.println("a的平方: " + squared);
    }
}