0

所以我最近一直在做一些 Project Euler,但由于某种原因,我的代码无法正常工作,因为 Java 一直在四舍五入我的 divsions。

public class Problem3 {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    double max = 0;
    double n = 600851475431.;

    for (double i = 2; i<Math.sqrt(n); i++){
        if (600851475431.%i == 0){
            if (isPrime (i) == true && i>max){
                max = i;
            }
        }
    }
    System.out.print(max);

}

public static boolean isPrime(double a){
    for (int i= 2; i<Math.sqrt(a); i++){
        if (a%i == 0){
            return false;
        }
    }
    return true;
}

首先,600851475431%168887 不等于 0,但 Java 一直认为它确实如此。

4

2 回答 2

1

提示:当您需要准确表示大于 的数字时2^31 - 1,请使用long。当您需要准确表示大于 的数字时2^64 - 1,请使用BigInteger

600851475431 介于2^39和之间2^41

我让你下结论。

编辑
另一个提示:if (600851475431.%i == 0){
注意.. 这会强制将数字表示为doublen您在那里有一个具有明确定义类型的变量。用那个。

于 2013-05-11T09:03:03.417 回答
1

实际上,Java 是对的

  $ dc
    600851475431
    168887
    /
    p
    3557713
    168887
    *
    p
    600851475431
    ^D
  $

由于3557713 * 168887600851475431600851475431 % 168887是零。

于 2013-05-11T10:05:17.943 回答