3

我正在为学生创建一个小游戏,在一个地方,它必须显示2 7830457 +1的值

如果数字不是那么大,我可以调用 BigInteger 的 pow() 方法。由于数量很大,这种方法是没有用的。我怎样才能找到这种数字的巨大力量?请帮忙!

4

4 回答 4

8

在二进制中,它只有10000...017830456 个零。

在十进制中,将有大约 200 万位数字,即大约 2 兆字节的存储空间。这完全在BigInteger使用默认堆大小的可行性范围内。

在实践中,它甚至使用平方来快速计算它(尽管规范不保证)。但是,转换为 aString需要一些时间,因为它是线性时间操作。

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);
    }
}

这需要一点时间(尤其是最后的字符串转换),但这是完全合理的。

正如彼得所指出的,ONE向左移动 7830457 更整洁,请注意。我认为它不太清楚 - 当然它在字符串转换部分没有帮助。

编辑:几乎所有时间都花在字符串转换上。它最终在我的盒子上完成了。我再也看不到它的开始,但它的结尾是……

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 回答