Java 找到一个数的真正大的幂

Java 找到一个数的真正大的幂,java,math,Java,Math,我正在为学生创建一个小游戏,在一个地方,它必须显示27830457+1的值 如果数字没有这么大,我可以调用BigInteger的pow()方法。由于数字很大,这种方法是无用的。我怎样才能发现这种数字的巨大威力呢?请帮忙 在二进制中,只有10000…01和7830456个零 在十进制中,大约有200万位,即大约2兆字节的存储空间。这完全符合使用默认堆大小的biginger的可行性 在实践中,它甚至可以使用它来快速计算(尽管规范没有保证)。但是,转换为字符串将需要一些时间,因为这是一个线性时间操作

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


如果数字没有这么大,我可以调用BigInteger的pow()方法。由于数字很大,这种方法是无用的。我怎样才能发现这种数字的巨大威力呢?请帮忙

在二进制中,只有
10000…01
和7830456个零

在十进制中,大约有200万位,即大约2兆字节的存储空间。这完全符合使用默认堆大小的
biginger
的可行性

在实践中,它甚至可以使用它来快速计算(尽管规范没有保证)。但是,转换为
字符串将需要一些时间,因为这是一个线性时间操作

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);
        }
    }
}
第一个数字是:

27337386390628313557307248577320330081685564297380787917616071605499494954510637855005417718646965163546351366598485776179684795037788083691434244529029919271706271982523405671343346691344477538489450109143463160971624647030074196843646464646711255284359044827054545454545454542464709022874335193717171716464787874747479853926093017741854273674307828342906292658590738144666877144084360258098604629262756100873545959924360001872161529545427749915099923749855388798808979026396004516279149230434834365144195444133063912785293036501127732975020906194591678885632740715878486230858800670919689112362967321192529374971527695415795161506594249970419682131224505683641219764742690979106356412279229233980922424097555541159858558310154592047803914705915432812673737165562722593866838645382639223987236022101738001514053321002759136195595635758294983698069570315260772582363051862542690568111341351333509369242941013452943356988663395619188575842297442779011807920291801564850000865281744008786570046457268928169435899697010531587602105121715169813345080894134663207988962182426459112857728293494879091169132947503432465638428341323048500506076666988301932660490870167246016897078366691705399794247746213819662270451539826029606671683482160663572103374


确认人。

您应该能够使用BigInteger计算此值

 System.out.println(BigInteger.ONE.shiftLeft(7830457).add(BigInteger.ONE));

我不知道你为什么认为
biginger
不符合以下要求:

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

试着这样做:

BigInteger mant = new BigInteger("2");
BigInteger result = mant.pow(7830457).add(BigInteger.ONE);

为什么不以指数形式显示呢?这个数字不适合在电脑屏幕上显示。如果你只显示两百万个随机数字,没有人会注意到它有什么问题,甚至不会在意他们是否知道这个数字是错的。两百万位的精确顺序有什么教育价值?只显示前几个数字。完整的数字将写入一个文件。至少,这是我建议做的。不,答案必须是正确的。有一位大师在那里等待确切的答案。这和什么有关系吗?在这种情况下,是一个移位和or
biginger.ONE.shift(7830457)。add(biginger.ONE)
或其他无法使用它的东西。给出结果需要几年的时间。你的机器用了多少分钟?你是在IDE中运行的吗?你的公羊是什么?请回答:)@Sepala:没有打印字符串的版本很快就完成了。诚然,将其转换为字符串的版本仍在使用中,但我怀疑这需要几年的时间:)我的机器有8GB内存,但JVM目前只使用了大约150MB。(不,它正在命令行上运行。)谢谢您的回复。我想我的机器会比你的慢4倍。我现在正在运行它。我会让你know@DanielFischer:控制台输出不会花那么长时间,至少相对于转换花费的金额而言。OK。你介意举个例子吗?我真的不明白!这是什么样的网络资源!!!究竟有多快?这就是先进算法的威力。Java使用
O(n^2)
算法进行乘法和转换。WolframAlpha使用GMP,它有一个用于乘法的
O(n*log(n))
,用于转换的
O(n*log(n)^2)
。太棒了!我不知道GMP是什么。那是一种编程语言吗?当我在谷歌上搜索时,它显示了药店、药品和“良好制造”的结果。如果它是一种语言,我很高兴学习它!请给我更多的信息+1对于平方求幂,它解决了我的问题