以下Java程序怎么了?

问题描述 投票:-2回答:2

我试图创建一个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);
    }
}

java primes long-integer prime-factoring
2个回答
0
投票

看起来您的程序编译正常,但是陷入了无限(或很长)循环中如果将System.out.println("program started");放在main方法的开头,则可能会显示它。

此外,如果您降低long num,也会看到方法完成。


编辑:您有两个嵌套的for循环。第一个执行num / 2次,另一个执行(num / 2)/ 2。

如果我没记错的话,它将循环(num ^ 2)/ 8次。对于long num = 600851475143L;来说,很多。因此,您的应用被卡住了4.51 × 10^22次以上]


0
投票

绝对不是一个无限循环。只是您的代码效率不高,因此打印结果花费的时间太长。如果您使用较小的数字进行测试,则会得到结果。我已经发布了有效的方法

© www.soinside.com 2019 - 2024. All rights reserved.