学生向けの小さなゲームを作成していますが、ある場所に 2 7830457 +1の値を表示する必要があります
数値がそれほど大きくない場合は、BigInteger の pow() メソッドを呼び出すことができます。数が非常に多いので、その方法は役に立ちません。この種の数字の巨大な力をどのように見つけることができますか? 助けてください!
バイナリでは10000...01
、7830456 個のゼロだけです。
10 進数では、約 200 万桁になり、約 2 メガバイトのストレージになります。これはBigInteger
、デフォルトのヒープ サイズで実現可能な範囲内です。
実際には、二乗による累乗を使用して高速に計算します (ただし、仕様では保証されていません)。ただし、線形時間操作であるため、への変換にはString
時間がかかります。
import java.math.BigInteger;
public class BigPow {
public static void main(String[] args) {
BigInteger result = (new BigInteger("2")).pow(27830457).add(BigInteger.ONE);
System.out.println(result);
}
}
数字をゆっくりと出力するバージョンは次のとおりです。
import java.math.BigInteger;
public class BigPow {
public static void main(String[] args) {
BigInteger result = (new BigInteger("2")).pow(27830457).add(BigInteger.ONE);
BigInteger powten = BigInteger.TEN.pow(2357202);
while(powten.compareTo(BigInteger.TEN) > 0) {
BigInteger digit = result.divide(powten).mod(BigInteger.TEN);
System.out.print(digit);
powten = powten.divide(BigInteger.TEN);
}
}
}
最初の数字は次のとおりです。
27337386390628313557307248857732033008168556429738078791761607160549944954510637855005417718646965163546351365984857761796847950377880836291434244529029919271706271982523405687134334692691344477538489450971091437463160940371624647030064741968436401566711255284353690448270545402444641547030399228243743315193608710148721648879085592699913299745785392609301774185427367430782834290629265859073814466687714408436025809860462926275610087354595992436000187216152954542774991509992374985538879880897902639600451627914923043483436514419544413306391278529303650112773297502090619459167888563274071587848623085880067091968911236296732119252937497152769541579516150659424997041968213122450568364121976474269097910635641227922923398092242409755554115985855831015459204780391470591543281267373716556272259386683864538263922398723602210173800151405332100275913619559563575829498369806957031526077258236305186254269056811134135133350936924294101345294335698866339561918857584229744277901180792029180156485000086528174400878657004645726892816943589969701053158760210512171516969813345080894134663207988962182426459128577282934948790911691329475034324656384238413230485050607666988301932660490870167246016897007835866691705399794247746213819662270451531049826029606671683482160663572103374
WolframAlphaによって確認されました。
なぜあなたがこれに及ばないと思うのか私にはわかりませんBigInteger
:
import java.math.BigInteger;
public class Test {
public static void main(String[] args) throws Exception {
BigInteger big = BigInteger.valueOf(2)
.pow(7830457)
.add(BigInteger.ONE);
System.out.println(big);
}
}
少し時間がかかりますが (特に最後の文字列変換)、まったく問題ありません。
Peter が指摘したように、ONE
7830457 を左にシフトする方がはるかにきれいです。少しわかりにくいと思いますが、もちろん、文字列変換の部分では役に立ちません。
編集: ほとんどすべての時間が文字列変換に費やされます。しかし、それは私の箱で最後に終わりました。もう始まりは見えませんが、終わりは…
08570502260645006898157834607641626568029302766491883299164453304032280181734737
79366998940913082443120328458954436211937775477966920836932628607888755839700303
873
これは BigInteger で計算できるはずです。
System.out.println(BigInteger.ONE.shiftLeft(7830457).add(BigInteger.ONE));
次のようなものを試してください。
BigInteger mant = new BigInteger("2");
BigInteger result = mant.pow(7830457).add(BigInteger.ONE);