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
类的对象是不可变的,因此每次运算都会返回一个新的对象。这意味着在进行连续的运算时,需要频繁地创建新的对象,导致内存和性能的消耗。
为了提高性能,可以使用 StringBuilder
或 StringBuffer
类来代替字符串拼接,或者使用 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
方法可以用来计算一个数的乘方,shiftLeft
和 shiftRight
方法可以用来进行位移操作。
需要注意的是,在使用 shiftLeft
和 shiftRight
方法进行位移操作时,如果移动的位数超过了整数的位数,则会产生溢出。此外,由于 BigInteger
的运算速度比较慢,因此在进行位移操作时,需要考虑到性能问题,避免使用过多的位移操作。
总之,BigInteger
是一个非常实用的类,它可以处理任意大小的整数,支持所有基本的整数运算和其他的高级运算,是 Java 中处理大整数的首选类之一。
以下是 BigInteger
的一些常用操作示例:
BigInteger
对象:BigInteger num1 = new BigInteger("12345678901234567890");
BigInteger num2 = BigInteger.valueOf(1234567890L);
BigInteger sum = num1.add(num2);
BigInteger diff = num1.subtract(num2);
BigInteger product = num1.multiply(num2);
BigInteger quotient = num1.divide(num2);
BigInteger remainder = num1.remainder(num2);
int cmp = num1.compareTo(num2); // 返回值为 -1、0 或 1,表示 num1 小于、等于或大于 num2
boolean isEqual = num1.equals(num2); // 判断两个数是否相等
BigInteger shiftedLeft = num1.shiftLeft(5); // 将 num1 左移 5 位
BigInteger shiftedRight = num1.shiftRight(5); // 将 num1 右移 5 位
BigInteger negated = num1.negate(); // 取 num1 的相反数
BigInteger gcd = num1.gcd(num2); // 计算 num1 和 num2 的最大公约数
BigInteger inverse = num1.modInverse(num2); // 计算 num1 对于 num2 的乘法逆元
BigInteger power = num1.pow(3); // 计算 num1 的 3 次幂
需要注意的是,由于 BigInteger
是不可变的,因此所有的运算都会返回一个新的 BigInteger
对象。因此,在进行连续的运算时,需要注意内存和性能的问题。
toString
方法将 BigInteger
转换为字符串:String str = num1.toString();
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