【问题标题】:Prime number algorithm not working素数算法不起作用
【发布时间】:2016-02-23 08:14:44
【问题描述】:
package coding;
public class Prob7 {
public static void main(String[] args) {
    long flag=0;
    long counter=0;
    long prime;
    for(prime=2;;prime++){
        System.out.println(counter);
        flag=0;
        long check=2;
        while(check<=prime/2){
            if(prime%check==0){
                flag=1;
                break;
            }
        }
        if(flag==0){
            if(counter==10001){
                System.out.println(prime);
                break;
            }
            counter++;
        }

    }


  }

}

我想找到第 10001 个素数,我在 for 循环中嵌套了一个 while 循环,以查找它是否是素数。我使用 flag 在循环外进行检查,并在必要时跳出 while 循环。但是控制台没有做任何事情。所以 for 循环的下一行,我输入了System.out.println(counter);for 检查正在发生的事情。计数器打印出来

0
1
2
2

然后停止。我尝试调试,但我无法找出问题所在。 我没有为 for 循环设置条件,因为我有一个 break 语句,如果素数计数器达到 10001,它将跳出循环。

PS:我知道我可以使用 isPrime(),但我只是想练习这些算法。

【问题讨论】:

  • 我建议你学习如何调试简单的程序,这个程序有一个直接的错误。如果你不这样做,你会发现很难调试更难的程序。
  • 一旦您开始尝试调试多线程应用程序,有时这似乎是不可能的。
  • 顺便说一句,你只需要循环到 sqrt(n) 并且在跳过偶数之后你只需要检查奇数,即for (int check = 3, max = (int) Math.sqrt(prime); i &lt; max; i+=2) 这会快得多。

标签: java loops primes


【解决方案1】:

您不会在内部 while 循环中增加 check 变量。修改为:

    while(check<=prime/2){
        if(prime%check==0){
            flag=1;
            break;
        }
        ++check;
    }

一般来说有很多方法可以改进算法:

  1. 您可以在开头测试 2,然后只检查奇数(所以 check += 2
  2. 您可以在开始时计算 sqrt(prime),然后只循环直到平方根(因为 (sqrt(x)+1)^2 将始终高于素数。
  3. 您可以考虑完全不同的算法,记住已经成功测试的素数,并且在测试另一个素数测试时已经发现素数仅作为除数。这类似于Sieve of Eratosthenes

【讨论】:

  • 啊!哥来了谢谢你。我真傻。顺便说一句,我使用的算法需要大量时间(比如 20 秒)才能完成。 isPrime() 效率更高吗?
  • @SiddharthVenu 我建议你向自己证明你可以在调试器中看到这个问题(现在你知道它在做什么)
  • @SiddharthVenu :有很多方法可以改进它。首先,您可以在开始时测试 2,然后只检查奇数(所以 `check += 2)。其次,您可以在开始时计算 sqrt(prime),然后只循环直到平方根(因为 (sqrt(x)+1)^2 将始终高于素数。第三,您可以考虑完全不同的算法,记住素数已经过测试并仅通过它们。
  • 考虑将该评论推广到您的答案,特别是您的最后一点。那我就投赞成票。
【解决方案2】:

您不会在 while 循环中增加 check。现在,每次将其增加 2(扫描除 2 之外的偶数是没有意义的)。还有更快的方法,但现在就可以了。

另外,你只需要跑到prime的平方根,而不是一半。这会加快速度。

【讨论】:

  • 是的,我明白了。我现在就试试。谢谢
猜你喜欢
  • 2016-08-10
  • 1970-01-01
  • 2014-02-14
  • 2016-02-02
  • 2017-08-10
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多