3

学生向けの小さなゲームを作成していますが、ある場所に 2 7830457 +1の値を表示する必要があります

数値がそれほど大きくない場合は、BigInteger の pow() メソッドを呼び出すことができます。数が非常に多いので、その方法は役に立ちません。この種の数字の巨大な力をどのように見つけることができますか? 助けてください!

4

4 に答える 4

8

バイナリでは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によって確認されました。

于 2012-07-03T19:33:27.153 に答える
4

なぜあなたがこれに及ばないと思うのか私にはわかりません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 が指摘したように、ONE7830457 を左にシフトする方がはるかにきれいです。少しわかりにくいと思いますが、もちろん、文字列変換の部分では役に立ちません。

編集: ほとんどすべての時間が文字列変換に費やされます。しかし、それは私の箱で最後に終わりました。もう始まりは見えませんが、終わりは…

08570502260645006898157834607641626568029302766491883299164453304032280181734737
79366998940913082443120328458954436211937775477966920836932628607888755839700303
873
于 2012-07-03T19:35:34.943 に答える
3

これは BigInteger で計算できるはずです。

 System.out.println(BigInteger.ONE.shiftLeft(7830457).add(BigInteger.ONE));
于 2012-07-03T19:33:44.873 に答える
1

次のようなものを試してください。

BigInteger mant = new BigInteger("2");
BigInteger result = mant.pow(7830457).add(BigInteger.ONE);
于 2012-07-03T19:38:58.870 に答える