如何在Java中处理巨大的数字?
我正在为我竞争性编程课的家庭作业写一个程序,我一个问题也解决不了。这个问题需要您根据特定条件计算特定字符串的所有排列,我的程序就是这样做的。然而,问题是,当输入是一个非常大的字符串时,它最多可以是10^6 这个问题的解决方案是2^result,其中结果取决于输入字符串的长度,所以对于10^6,它最多可以是5*10^5。溶液必须以:结果%(10^9+7)的形式给出 我尝试将解决方案放入一个BigInteger中,它耗尽了堆空间。我试过和替身一起工作,结果都溢出来了。我有没有遗漏什么,或者有没有办法解决这个问题?多谢各位 以下是一些尝试:如何在Java中处理巨大的数字?,java,largenumber,Java,Largenumber,我正在为我竞争性编程课的家庭作业写一个程序,我一个问题也解决不了。这个问题需要您根据特定条件计算特定字符串的所有排列,我的程序就是这样做的。然而,问题是,当输入是一个非常大的字符串时,它最多可以是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个数字吗?(还有,在你问题的其他地方也是如此。)@那个家伙非常感谢,这正是我一直在寻找的。以前从未听说过模块化表示,我现在已经实现了,并且它正在工作。你可以把你的评论作为回答,我会接受的。