如何在Java中处理大量数字?

时间:2016-11-06 16:35:50

标签: java largenumber

我正在为我的竞争性编程课程编写一个程序,我无法克服一个问题。此问题要求您根据特定条件计算某个字符串的所有排列,并且我的程序会这样做。但是,问题是当输入是一个非常大的字符串时,它可以达到10 ^ 6。

问题的解决方案是2 ^结果,其中结果取决于输入字符串的长度,因此对于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 �

1 个答案:

答案 0 :(得分:4)

你不需要处理非常大的数字就可以了。

该作业旨在帮助您实施modular exponentiation。 BigInteger已将其实现为modPow。它允许您计算(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