4

Math.pow() 返回一个双精度值,并且仅将 int 作为参数...BigInteger 作为没有用于查找 BigInteger^BigInteger 的函数通过循环执行它需要很长时间...我还有什么方法失踪吗?

提前谢谢...

4

4 回答 4

7

您可以使用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大于您预期答案的作为模数。

于 2013-11-01T19:59:50.880 回答
3

如果你有 2^x,其中 x 是一个很大的数字,那么你可以通过位移来做到这一点。例子:

2^4 == (1 << 4);
2^12 == (1 << 12);

使用 BigIntegers,您可以使用 shiftLeft() 和 shiftRight() 方法做同样的事情。

于 2013-11-01T20:06:17.263 回答
1

您可以使用 pow,但左移可能会更快。

 BigInteger bi = BigInteger.ONE.shiftLeft(1_000_000_000);

不支持 BigInteger.pow(BigInteger) 的原因很可能是,即使是最简单的示例,您也需要比世界上任何一台计算机都多的内存来保存这样的值。需要 BigInteger 指数的最小值是 2^63,而 2<<2^63 需要 2^60 字节的内存或一万亿 GB。

于 2013-11-01T20:17:22.160 回答
1

Math.pow()返回一个双精度值,并且只接受 int 作为参数。

不,它需要两个双精度并返回一个双精度:Javadoc

如果您不需要确切的答案,它可能会做得很好。

于 2013-11-01T20:02:08.063 回答