私は競争力のあるプログラミングクラスの宿題のためのプログラムを書いています.1つの問題を乗り越えることはできません。この問題は、特定の条件に基づいて特定の文字列のすべての順列を計算する必要があり、私のプログラムはそれを行います。しかし、問題は、入力が実際に大きな文字列である場合です。最大10^6になります。Javaで膨大な数を扱うにはどうすればよいですか?
問題は2^resultです。結果は入力文字列の長さに依存するため、10^6の場合は5 * 10^5までです。解決策は、result%(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 �
あなたは[BigDecimalを](https://docs.oracle.com/javase/8/docs/api/javaを見てきました/math/BigDecimal.html)? – DaoWen
BigIntegerを試しました。ヒープスペースが不足しています。 BigDecimalを試していない、今、それを試してみましょう、ありがとう。 – leonz
あなたの宿題は[モジュラ累乗](https://en.wikipedia.org/wiki/Modular_exponentiation)を実装することです。 BigIntegerはすでに[modPow]として実装しています(https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#modPow(java.math.BigInteger、%20java.math.BigInteger) )。あなたは指数を完全に計算して、残りの部分を取ることは想定されていません。 –