我有一个小问题:如果我用Java计算13 ^ 30 mod 31,为什么会得到25的结果?结果应为1。
提前回答。
ps。我在https://www.compilejava.net/上编写了代码

import java.lang.Math;
public class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println(calculateModulo());

  }

  public static String calculateModulo(){

    String res = new String();

    for (int i = 1; i < 31; i++){
      for (int j = 1; j < 31; j++){

          double var = Math.pow((double)i, (double)j);


         if (j == 30) {
            System.out.println("adding: "+i);
            res = res + "  " + i;
          }
          if (var % 31 == 1) {
            System.out.println("The number " + i +" to the power of "+j +" modulo 31 results in "+var % 31);
            break;
          }

        }
    }
    System.out.println(Math.pow(13,30)+"         "+(Math.pow(13,30)%31)); // why is the output of this "2.619995643649945E33         25.0"
    return res;
  }
}

最佳答案

您将这些操作的结果存储在double中。请注意,double只有64个字节长。无法将1330的结果准确地存储在64个字节中。不,编译器也无法使用技巧进行计算。见Is floating point math broken?

尝试使用BigInteger

BigInteger a = new BigInteger("13");
BigInteger b = a.pow(30);
BigInteger c = b.mod(new BigInteger("31"));
System.out.println(c);

关于java - 参数13和30的Pow()函数失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47558254/

10-08 21:10