该代码可以运行和编译,但是当我输入很大的数字时什么也不会发生。 (Euler项目,问题3)

时间:2019-03-26 12:01:24

标签: java

我是新手。

因此,我一直在做Euler问题项目以提高我的Java技能,并且我超过了前2个。我坚持使用第3个。它说:

“ 13195的主要因素是5、7、13和29。

600851475143的最大素数是什么?”

我编写了以下代码:

public class Exercise {
    public static void main(String[] args) {
        long a = 600851475143L;
        long i = 1;
        boolean isPrime = true;
        long currentNum = 0;
        while (i <= a) {
            if (a % i == 0) {
                for (long j = 1; j < a; j++) {
                    if (a == i || a % j == 0) {
                        isPrime = false;
                    } else {
                        currentNum = i;
                    }
                }
            }
            i++;
        }
        System.out.println("the largest prime factor of " + a + " is " + currentNum);
    }
}

它非常适合较小的数字,例如10、20、55、100、560523等,但是当我输入较大的数字(例如600851475143L)时,代码可以编译并运行,但是什么也没有发生。

任何帮助表示感谢,谢谢!

4 个答案:

答案 0 :(得分:4)

查看您的a变量。是600851475143L
这意味着您的处理器必须根据您的情况执行最多600851475143个循环周期:

while (i <= a) {
    i++;
}

我没有考虑while()循环中的代码,但是即使没有它,代码也太多了,即使对于现代计算机也是如此:)

如果要计算该范围数的质因子,则应考虑使用比简单迭代更有效的方法。

答案 1 :(得分:0)

您具有嵌套条件,执行条件将跳CPU。

while (i <= a) {// This condition will be executed 600851475143 times
                if (a % i == 0) {
                    for (long j = 1; j < a; j++) {// This condition will be executed 600851475143 times

到目前为止,a = 600851475143,代码将执行600851475143*600851475143次。这就是为什么您看不到输出的原因,因为CPU忙于执行许多条件。

这也是您看到a = 100的输出的原因,因为对于此输入的迭代次数= 100*100,在任何现代机器上都不会花费很多时间

答案 2 :(得分:0)

type Product = {Name : string; BasePrice: int}
type Size = {Medium: int; Large: int}

type Food = | Product of Product| Size of Size

let food = Food({Name = "Bagel"; BasePrice = 20}; {Medium = 10; Large = 20})

尝试这个

答案 3 :(得分:0)

帕维尔·斯米尔诺夫(Pavel Smirnov)给出的答案是正确的。实际上,代码 也在为值600851475143L运行。只是输入数字很大,因此代码需要花费大量时间才能完成。甚至代码也不处于死锁状态。尽管如此,要证明这一点,您可以在内部循环主体中添加一个日志,例如:

System.out.println("Testing Prime for Number :"+j);

在内部循环for (long j = 1; j < a; j++){}

这样做,您将看到代码实际上正在运行。

P.S .:此算法将循环600851475143L * 600851475143L次,这确实很耗时。