java常用API Biginteger基本使用方法和原理


BigInteger 是 Java 提供的一个用于处理大整数的类。它可以表示任意大小的整数,并支持所有基本的整数运算,如加、减、乘、除、取余、比较等。

BigInteger 类的构造方法可以接受一个字符串或一个整数作为参数,用于创建一个 BigInteger 对象。例如,以下代码创建了一个值为 12345678901234567890 的 BigInteger 对象:

BigInteger bigInt = new BigInteger("12345678901234567890");

除此之外,BigInteger 类还提供了大量的方法,用于执行各种常见的整数运算。以下是一些常用的方法:

  • add(BigInteger val):将此 BigInteger 与指定的 BigInteger 相加。
  • subtract(BigInteger val):从此 BigInteger 中减去指定的 BigInteger
  • multiply(BigInteger val):将此 BigInteger 与指定的 BigInteger 相乘。
  • divide(BigInteger val):将此 BigInteger 除以指定的 BigInteger
  • remainder(BigInteger val):返回此 BigInteger 除以指定的 BigInteger 的余数。
  • compareTo(BigInteger val):将此 BigInteger 与指定的 BigInteger 进行比较。
  • equals(Object obj):比较此 BigInteger 与指定的对象是否相等。

BigInteger 的原理是利用数组来存储整数的各个位数,每个元素都是一个 int 类型的数字。在进行加、减、乘、除等运算时,BigInteger 会按位进行计算,并将结果存储在新的数组中。

由于 BigInteger 可以表示任意大小的整数,因此它的运算速度比较慢,通常只在需要处理大整数的情况下使用。

BigInteger 内部的实现原理是使用一个 int 数组来存储大整数的每一位,数组的每个元素都表示这个数的一个二进制位,其中数组的第一个元素存储最低位,数组的最后一个元素存储最高位。

BigInteger 类中,常用的操作都被封装在了方法中,例如加法、减法、乘法、除法、求余等等。这些方法都是按照相应的算法实现的,具体实现的细节并不需要用户关心。

例如,在两个 BigInteger 对象相加时,BigInteger 会检查两个对象的符号(正数、负数或零),然后使用一个类似于小学竖式的算法进行加法运算,最后将结果存储在一个新的 BigInteger 对象中。

在进行 BigInteger 运算时,需要注意一些性能问题。由于 BigInteger 类的对象是不可变的,因此每次运算都会返回一个新的对象。这意味着在进行连续的运算时,需要频繁地创建新的对象,导致内存和性能的消耗。

为了提高性能,可以使用 StringBuilderStringBuffer 类来代替字符串拼接,或者使用 BigInteger 类的原始类型转换方法(如 intValue()longValue() 等)来避免频繁创建新对象的问题。

除了上述基本的运算方法外,BigInteger 类还提供了一些其他的方法,用于处理大整数。以下是一些常用的方法:

  • gcd(BigInteger val):计算此 BigInteger 和指定的 BigInteger 的最大公约数。
  • modInverse(BigInteger m):计算此 BigInteger 对于指定的模数的乘法逆元。
  • pow(int exponent):计算此 BigInteger 的指定次幂。
  • shiftLeft(int n):将此 BigInteger 左移 n 位。
  • shiftRight(int n):将此 BigInteger 右移 n 位。

例如,gcd 方法可以用来计算两个数的最大公约数,pow 方法可以用来计算一个数的乘方,shiftLeftshiftRight 方法可以用来进行位移操作。

需要注意的是,在使用 shiftLeftshiftRight 方法进行位移操作时,如果移动的位数超过了整数的位数,则会产生溢出。此外,由于 BigInteger 的运算速度比较慢,因此在进行位移操作时,需要考虑到性能问题,避免使用过多的位移操作。

总之,BigInteger 是一个非常实用的类,它可以处理任意大小的整数,支持所有基本的整数运算和其他的高级运算,是 Java 中处理大整数的首选类之一。

以下是 BigInteger 的一些常用操作示例:

  1. 创建一个 BigInteger 对象:
BigInteger num1 = new BigInteger("12345678901234567890");
BigInteger num2 = BigInteger.valueOf(1234567890L);
  1. 进行加法、减法、乘法和除法运算:
BigInteger sum = num1.add(num2);
BigInteger diff = num1.subtract(num2);
BigInteger product = num1.multiply(num2);
BigInteger quotient = num1.divide(num2);
  1. 进行求余运算和比较运算:
BigInteger remainder = num1.remainder(num2);
int cmp = num1.compareTo(num2); // 返回值为 -1、0 或 1,表示 num1 小于、等于或大于 num2
boolean isEqual = num1.equals(num2); // 判断两个数是否相等
  1. 进行位移和取反运算:
BigInteger shiftedLeft = num1.shiftLeft(5); // 将 num1 左移 5 位
BigInteger shiftedRight = num1.shiftRight(5); // 将 num1 右移 5 位
BigInteger negated = num1.negate(); // 取 num1 的相反数
  1. 其他常用操作:
BigInteger gcd = num1.gcd(num2); // 计算 num1 和 num2 的最大公约数
BigInteger inverse = num1.modInverse(num2); // 计算 num1 对于 num2 的乘法逆元
BigInteger power = num1.pow(3); // 计算 num1 的 3 次幂

需要注意的是,由于 BigInteger 是不可变的,因此所有的运算都会返回一个新的 BigInteger 对象。因此,在进行连续的运算时,需要注意内存和性能的问题。

  1. 使用 toString 方法将 BigInteger 转换为字符串:
String str = num1.toString();
  1. 使用 valueOf 方法将其他类型的数值转换为 BigInteger
BigInteger num3 = BigInteger.valueOf(1234); // 将 int 类型的数值转换为 BigInteger
BigInteger num4 = BigInteger.valueOf(1234567890123456789L); // 将 long 类型的数值转换为 BigInteger

需要注意的是,BigInteger 的运算速度比较慢,因此在处理大量数据时,需要考虑到性能问题,避免使用过多的运算操作。

下面是一个示例代码,演示了如何使用 BigInteger 来计算斐波那契数列的第 n 项:

import java.math.BigInteger;

public class Fibonacci {
    public static BigInteger fibonacci(int n) {
        if (n == 0) {
            return BigInteger.ZERO;
        } else if (n == 1) {
            return BigInteger.ONE;
        } else {
            BigInteger a = BigInteger.ZERO;
            BigInteger b = BigInteger.ONE;
            for (int i = 2; i <= n; i++) {
                BigInteger c = a.add(b);
                a = b;
                b = c;
            }
            return b;
        }
    }

    public static void main(String[] args) {
        int n = 100;
        BigInteger result = fibonacci(n);
        System.out.println("fibonacci(" + n + ") = " + result);
    }
}

该程序使用 BigInteger 类来计算斐波那契数列的第 n 项。由于斐波那契数列的增长速度非常快,因此需要使用 BigInteger 类来处理数值溢出的问题。


原文链接:codingdict.net