Math.pow() 返回一个双精度值,并且仅将 int 作为参数...BigInteger 作为没有用于查找 BigInteger^BigInteger 的函数通过循环执行它需要很长时间...我还有什么方法失踪吗?
提前谢谢...
Math.pow() 返回一个双精度值,并且仅将 int 作为参数...BigInteger 作为没有用于查找 BigInteger^BigInteger 的函数通过循环执行它需要很长时间...我还有什么方法失踪吗?
提前谢谢...
您可以使用BigInteger.pow()
大指数。由于 10 9适合 aint
并且也可以完全表示为 a double
,因此您可以这样做:
int exp = (int) Math.pow(10, 9);
BigInteger answer = BigInteger.valueOf(2).pow(exp);
对于大于 的指数,这显然会失效Integer.MAX_VALUE
。但是,您可以使用BigInteger.modPow(BigInteger exponent, BigInteger m)
将 a 提升BigInteger
到另一个BigInteger
作为电源,模块 a third BigInteger
。您只需要首先创建一个BigInteger
大于您预期答案的作为模数。
如果你有 2^x,其中 x 是一个很大的数字,那么你可以通过位移来做到这一点。例子:
2^4 == (1 << 4);
2^12 == (1 << 12);
使用 BigIntegers,您可以使用 shiftLeft() 和 shiftRight() 方法做同样的事情。
您可以使用 pow,但左移可能会更快。
BigInteger bi = BigInteger.ONE.shiftLeft(1_000_000_000);
不支持 BigInteger.pow(BigInteger) 的原因很可能是,即使是最简单的示例,您也需要比世界上任何一台计算机都多的内存来保存这样的值。需要 BigInteger 指数的最小值是 2^63,而 2<<2^63 需要 2^60 字节的内存或一万亿 GB。