BigInteger 类用于数学运算,该运算涉及超出所有可用原始数据类型限制的非常大的整数计算。
这样一来,BigInteger类由于其庞大的方法库,使用起来非常方便,并且在竞技编程中也被大量使用。
下面给出了原始算术中的简单语句及其以 BigInteger 对象表示的类似语句的列表。
例子:
int a, b; BigInteger A, B;
初始化如下:
a = 54; b = 23;
A = BigInteger.valueOf(54); B = BigInteger.valueOf(37);
对于可用作字符串的整数,您可以按如下方式初始化它们:
A = new BigInteger(“54”); B = new BigInteger(“123456789123456789”);
为了便于初始化,BigInteger 类中还定义了一些常量,如下所示:
A = BigInteger.ONE; // Other than this, available constant are BigInteger.ZERO // and BigInteger.TEN
数学运算如下:
int c = a + b; BigInteger C = A.add(B);
其他类似的函数有subtract()、multiply()、divide()、remainder(),但所有这些函数都以BigInteger作为参数,因此如果我们想要对整数或字符串进行此操作,请在传递它们之前将它们转换为BigInteger函数如下图所示:
String str = “123456789”; BigInteger C = A.add(new BigInteger(str)); int val = 123456789; BigInteger C = A.add(BigInteger.valueOf(val));
从BigInteger中提取值如下:
int x = A.intValue(); // value should be in limit of int x long y = A.longValue(); // value should be in limit of long y String z = A.toString();
比较
if (a < b) {} // For primitive int if (A.compareTo(B) < 0) {} // For BigInteger
实际上compareTo根据值返回-1(小于)、0(等于)、1(大于)。为了平等,我们还可以使用:
if (A.equals(B)) {} // A is equal to B
Methods of BigInteger Class
方法 | 执行的操作 |
---|---|
add(BigInteger val) | 返回值为 (this + val) 的BigInteger。 |
BigInteger abs() | 返回一个 BigInteger,其值是此 BigInteger 的绝对值。 |
BigInteger and() | 返回值为 (this & val) 的BigInteger。 |
BigInteger andNot()) | 返回一个 BigInteger,其值为 (this & ~val)。 |
BigInteger bitCount() | 返回此 BigInteger 的二进制补码表示中与其符号位不同的位数。 |
BigInteger bitLength() | 返回此 BigInteger 的最小补码表示形式的位数,不包括符号位。 |
BigInteger byteValueExact() | 将此 BigInteger 转换为字节,检查丢失的信息。 |
BigInteger clearBit() | 返回BigInteger,其值等于指定位被清除的BigInteger。 |
BigInteger compareTo() | 将此 BigInteger 与指定的 BigInteger 进行比较。 |
divide(BigInteger val) | 返回值为 (this /val) 的BigInteger。 |
BigInteger divideAndRemainder() | 返回两个 BigIntegers 的数组,其中包含 (this /val) 后跟 (this % val)。 |
BigInteger doubleValue() | 将此 BigInteger 转换为双精度值。 |
BigInteger equals() | 将此 BigInteger 与指定对象进行比较是否相等。 |
BigInteger flipBit() | 返回一个BigInteger,其值等于此BigInteger(指定位翻转)。 |
BigInteger floatValue() | 将此 BigInteger 转换为浮点数。 |
gcd(BigInteger val) | 返回一个BigInteger,其值为abs(this) 和abs(val) 的最大公约数。 |
BigInteger getLowestSetBit() | 返回此 BigInteger 中最右边(最低位)一位的索引(最右边一位右侧的零位的数量)。 |
hashCode() | 返回此 BigInteger 的哈希码。 |
BigInteger intValue() | 将此 BigInteger 转换为 int。 |
BigInteger intValueExact() | 将此 BigInteger 转换为 int,检查丢失的信息。 |
isProbablePrime(int certainty) | 如果 BigInteger 可能是素数,则返回 true;如果肯定是合数,则返回 false。 |
BigInteger longValue() | 将此BigInteger 转换为长整型。 |
BigInteger longValueExact() | 将此 BigInteger 转换为长整型,检查丢失的信息。 |
BigInteger max()、min() | 返回此 BigInteger 和 val 的最大值。 |
BigInteger max()、min()) | 返回BigInteger 和 val 中的最小值。 |
BigInteger mod() | 返回一个 BigInteger,其值为 (this mod m)。 |
Java.math.BigInteger.modInverse() | 返回一个 BigInteger,其值为 (this-1 mod m)。 |
BigInteger modPow() | 返回 BigInteger,其值为 (thisexponent mod m)。 |
multiply(BigInteger val) | 返回一个 BigInteger,其值为 (this * val)。 |
BigInteger negate() | 返回值为 (-this) 的BigInteger。 |
nextProbablePrime() | 返回大于 BigInteger 的第一个整数,该整数可能是素数。 |
BigInteger not() | 返回值为 (~this) 的BigInteger。 |
BigInteger or() | 返回值为 (this | val) 的 BigInteger。 |
BigInteger pow() | 返回值为 (thisexponent) 的 BigInteger。 |
Java.math.BigInteger.probablePrime() | 返回一个正的BigInteger,它可能是素数,具有指定的位长度。 |
BigInteger remainder() | 返回一个 BigInteger,其值为 (this % val)。 |
BigInteger setBit() | 返回BigInteger,其值等于具有指定位设置的BigInteger。 |
BigInteger shiftLeft() | 返回一个 BigInteger,其值为 (this << n)。 |
BigInteger shiftRight() | 返回一个 BigInteger,其值为 (this >> n)。 |
BigInteger shortValueExact() | 将此 BigInteger 转换为短值,检查丢失的信息。 |
BigInteger signum() | 返回此 BigInteger 的符号函数。 |
BigInteger sqrt() | 返回此 BigInteger 的整数平方根。 |
sqrtAndRemainder() | 返回两个 BigIntegers 的数组,分别包含 this 的整数平方根 s 及其余数 this - s*s。 |
subtract(BigInteger val) | 返回值为 (this - val) 的 BigInteger。 |
BigInteger testBit() | 当且仅当设置了指定位时返回 true。 |
BigInteger toByteArray() | 返回一个字节数组,其中包含此 BigInteger 的补码表示形式。 |
BigInteger toString() | 返回此 BigInteger 的十进制字符串表示形式。 |
BigInteger toString() | 返回给定基数中此 BigInteger 的字符串表示形式。 |
BigInteger valueOf() | 返回一个BigInteger,其值等于指定的 long 值。 |
BigInteger xor() | 返回一个 BigInteger,其值为 (this^val)。 |
示例:
100 的阶乘包含 158 位数字,因此我们无法将其存储在任何可用的原始数据类型中。我们可以在其中存储任意大的整数。范围的上限没有理论上的限制,因为内存是动态分配的,但实际上,由于内存有限,您可以存储一个具有 Integer.MAX_VALUE 位的数字,这应该足以存储几乎所有大值。
例子:
Java
// Java program to find large factorials using BigInteger
import java.math.BigInteger;
import java.util.Scanner;
public class Example
{
// Returns Factorial of N
static BigInteger factorial(int N)
{
// Initialize result
BigInteger f = new BigInteger("1"); // Or BigInteger.ONE
// Multiply f with 2, 3, ...N
for (int i = 2; i <= N; i++)
f = f.multiply(BigInteger.valueOf(i));
return f;
}
// Driver method
public static void main(String args[]) throws Exception
{
int N = 20;
System.out.println(factorial(N));
}
}
输出:
2432902008176640000
Tip: If we have to write above program in C++, that would be too large and complex, we can look at Factorial of Large Number.
所以有了以上BigInteger类的函数知识之后,我们就可以轻松解决很多复杂的问题了,但是要记住,由于BigInteger类内部使用的是整数数组来进行处理,所以对BigIntegers对象的操作并不像BigIntegers类那样。与 BigIntgers 上的 add 函数的原语一样快,并不需要恒定的时间,它所花费的时间与 BigInteger 的长度成正比,因此程序的复杂性将相应改变。
必读:
相关用法
- Java BigInteger divideAndRemainder()用法及代码示例
- Java BigInteger max()用法及代码示例
- Java BigInteger min()用法及代码示例
- Java BigInteger modInverse()用法及代码示例
- Java BigInteger probablePrime()用法及代码示例
- Java BigInteger abs()用法及代码示例
- Java BigInteger add()用法及代码示例
- Java BigInteger and()用法及代码示例
- Java BigInteger andNot()用法及代码示例
- Java BigInteger bitCount()用法及代码示例
- Java BigInteger bitLength()用法及代码示例
- Java BigInteger clearBit()用法及代码示例
- Java BigInteger compareTo()用法及代码示例
- Java BigInteger divide()用法及代码示例
- Java BigInteger doubleValue()用法及代码示例
- Java BigInteger equals()用法及代码示例
- Java BigInteger flipBit()用法及代码示例
- Java BigInteger floatValue()用法及代码示例
- Java BigInteger gcd()用法及代码示例
- Java BigInteger getLowestSetBit()用法及代码示例
- Java BigInteger hashCode()用法及代码示例
- Java BigInteger intValue()用法及代码示例
- Java BigInteger intValueExact()用法及代码示例
- Java BigInteger isProbablePrime()用法及代码示例
- Java BigInteger longValue()用法及代码示例
注:本文由纯净天空筛选整理自佚名大神的英文原创作品 BigInteger Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。