なんらかの理由で大きな数を扱う場合、モジュラス演算子は正しい出力を与えません。コードを見てください
double x = Math.pow(65,17) % 3233;
出力は想定されていますが2790
、出力は887.0
私はそれがばかげていると確信していますが、私はそれを回避することはできません。前もって感謝します
なんらかの理由で大きな数を扱う場合、モジュラス演算子は正しい出力を与えません。コードを見てください
double x = Math.pow(65,17) % 3233;
出力は想定されていますが2790
、出力は887.0
私はそれがばかげていると確信していますが、私はそれを回避することはできません。前もって感謝します
の結果はMath.pow(65, 17)
として正確に表すことができず、可能なdouble
最も近い数値に丸められています。
このpow(a, b) % c
演算は「剰余累乗」と呼ばれます。ウィキペディアのページには、それを計算する方法について多くのアイデアが含まれています。
1 つの可能性を次に示します。
public static int powmod(int base, int exponent, int modulus) {
if (exponent < 0)
throw new IllegalArgumentException("exponent < 0");
int result = 1;
while (exponent > 0) {
if ((exponent & 1) != 0) {
result = (result * base) % modulus;
}
exponent >>>= 1;
base = (base * base) % modulus;
}
return result;
}
このように int を使用できます
int n = 65;
for (int i = 1; i < 17; i++)
n = n * 65 % 3233;
System.out.println(n);
または BigInteger のような
System.out.println(BigInteger.valueOf(65).pow(17).mod(BigInteger.valueOf(3233)));
両方とも印刷
2790