我试图创建一个Java程序来计算任何长数的最大素数(在这种情况下为600851475143)。当我尝试运行它时,该程序将无限期编译,而不会产生警告或结果。我知道可能有更简单/更直接的方法来解决此问题,但是我很好奇这个方法似乎不起作用的原因。我不认为逻辑本身是错误的,可能的错误可能是我对长变量的使用(我以前从未使用过它们)。
我已经声明了一些变量,只要允许它们将空间增加到'long'大小
public class LargestPrimeFactor {
public static void main(String []args){
long num = 600851475143L;
long largestPrimeFactor = 0L;
boolean flag = false;
//Find all factors of num
for (long i = 2L; i <= num/2; i++){
//If a number i is a factor of num
if((num % i) == 0){
//Find if the factor i is a prime number (only divisible by 1 and by itself)
//by checking whether dividing it by any number results in an integer
for (long j = 2L; j <= i/2; j++){
if (i/j == 0){
flag = true;
}
if (!flag){
if (i > largestPrimeFactor){
largestPrimeFactor = i;
}
}
}
}
}
System.out.print(largestPrimeFactor);
}
}
看起来您的程序编译正常,但是陷入了无限(或很长)循环中如果将System.out.println("program started");
放在main
方法的开头,则可能会显示它。
此外,如果您降低long num
,也会看到方法完成。
编辑:您有两个嵌套的for循环。第一个执行num / 2次,另一个执行(num / 2)/ 2。
如果我没记错的话,它将循环(num ^ 2)/ 8次。对于long num = 600851475143L;
来说,很多。因此,您的应用被卡住了4.51 × 10^22
次以上]
绝对不是一个无限循环。只是您的代码效率不高,因此打印结果花费的时间太长。如果您使用较小的数字进行测试,则会得到结果。我已经发布了有效的方法