2013-11-01 33 views
4

Math.pow()返回一個double值並且只接受int作爲參數... BigInteger因爲沒有用於查找BigInteger的函數^ BigInteger 通過循環做它需要很長時間... 有沒有更多的方式我失蹤?如何在java中找到類似2 ^(10^9)的數字的功率

日Thnx提前...

+0

看看這個問題:http://stackoverflow.com/questions/4582277/biginteger-powbiginteger – micha

+0

你可以看看exp(http://docs.oracle.com/javase/6/docs/api/ java/lang/Math.html#exp%28double%29) – Mike

+0

有兩點需要注意:1.假設沒有開銷,您需要125MB(1Gb)的內存來存儲該數值。可能你在計算時需要更多。在做這個硬核數學之前,問問自己是否有必要。簡化並應用數學屬性/身份(例如,您可以輕鬆地計算出我給出的一行以上的1GB值) –

回答

7

您可以使用BigInteger.pow()採取一個大的指數。由於10 適合的int,也是爲double精確表示,你可以這樣做:

int exp = (int) Math.pow(10, 9); 
BigInteger answer = BigInteger.valueOf(2).pow(exp); 

這顯然打破了對指數比Integer.MAX_VALUE大。但是,您可以使用BigInteger.modPow(BigInteger exponent, BigInteger m)BigInteger作爲電源提升至另一個BigInteger,第三個模塊爲BigInteger。您只需要首先創建一個大於您的預期答案的BigInteger作爲模數。

1

Math.pow()返回一個double值並且只接受int作爲參數。

不,它需要兩個雙打,並返回一個雙:Javadoc

如果你不需要確切的答案,它可能會做得很好。

1

如果你有2^x,其中x是一個很大的數字,那麼你可以通過位移來做到這一點。示例:

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

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

1

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

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

原因BigInteger.pow(BigInteger的)是不支持的可能是,即使是最簡單的例子,你需要比世界上任何電腦更多的內存來容納這樣的值。需要BigInteger指數的最小值是2^63和2 < < 2^63需要2^60個字節的內存或1萬億GB。

相關問題