所以我最近一直在做一些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一直认为它确实如此。
答案 0 :(得分:1)
提示:如果您需要大于2^31 - 1
的精确数字表示,请使用long
。如果您需要大于2^64 - 1
的准确数字表示,请使用BigInteger。
600851475431介于2^39
和2^41
之间。
我会让你得出结论。
修改
另一个提示:if (600851475431.%i == 0){
请注意.
。这会强制将数字表示为double
。您的变量n
中包含显式定义的类型。使用它。
答案 1 :(得分:1)
实际上,Java是对的
$ dc
600851475431
168887
/
p
3557713
168887
*
p
600851475431
^D
$
由于3557713 * 168887
完全是600851475431
,600851475431 % 168887
为零。