如何在Java中处理巨大的数字?

如何在Java中处理巨大的数字?,java,largenumber,Java,Largenumber,我正在为我竞争性编程课的家庭作业写一个程序,我一个问题也解决不了。这个问题需要您根据特定条件计算特定字符串的所有排列,我的程序就是这样做的。然而,问题是,当输入是一个非常大的字符串时,它最多可以是10^6 这个问题的解决方案是2^result,其中结果取决于输入字符串的长度,所以对于10^6,它最多可以是5*10^5。溶液必须以:结果%(10^9+7)的形式给出 我尝试将解决方案放入一个BigInteger中,它耗尽了堆空间。我试过和替身一起工作,结果都溢出来了。我有没有遗漏什么,或者有没有办法

我正在为我竞争性编程课的家庭作业写一个程序,我一个问题也解决不了。这个问题需要您根据特定条件计算特定字符串的所有排列,我的程序就是这样做的。然而,问题是,当输入是一个非常大的字符串时,它最多可以是10^6

这个问题的解决方案是2^result,其中结果取决于输入字符串的长度,所以对于10^6,它最多可以是5*10^5。溶液必须以:结果%(10^9+7)的形式给出

我尝试将解决方案放入一个BigInteger中,它耗尽了堆空间。我试过和替身一起工作,结果都溢出来了。我有没有遗漏什么,或者有没有办法解决这个问题?多谢各位

以下是一些尝试:

System.out.println((int) (Math.pow(2, counter) % (1e9 + 7)));
//it prints out 0, probably due to overflow?

DecimalFormat df = new DecimalFormat("#");
System.out.println(df.format(Math.pow(2, counter) % (1e9 + 7)));
//prints out �

要做到这一点,您不需要处理大量的数据

这项任务打算由你来执行。BigInteger已将其实现为。它允许您计算
(b^e)%c
,而无需处理比
c
大得多的数字

以下是维基百科关于重复平方求幂后余数的伪代码:

function modular_pow(base, exponent, modulus)
    if modulus = 1 then return 0
    Assert :: (modulus - 1) * (modulus - 1) does not overflow base
    result := 1
    base := base mod modulus
    while exponent > 0
        if (exponent mod 2 == 1):
           result := (result * base) mod modulus
        exponent := exponent >> 1
        base := (base * base) mod modulus
    return result

你看过吗?我试过BigInteger,它的堆空间用完了。还没有试过BigDecimal,现在就来试试吧,谢谢。你的作业是实现。BigInteger已将其实现为。你不应该完全计算指数,然后取余数。我不能完全理解你的问题,因为我不能告诉你什么时候谈论一个值,什么时候谈论一个值的大小。例如:当你说解决方案可以达到5*10^5时——这实际上不是一个很大的数字(只有500000)。你真的是说解决方案最多可以有5*10^5个数字吗?(还有,在你问题的其他地方也是如此。)@那个家伙非常感谢,这正是我一直在寻找的。以前从未听说过模块化表示,我现在已经实现了,并且它正在工作。你可以把你的评论作为回答,我会接受的。