【问题标题】:Findind Prime Numbers - my code does not work [closed]查找素数 - 我的代码不起作用[关闭]
【发布时间】:2020-05-13 11:44:12
【问题描述】:

我有这段代码,我想用它来查找素数:

public class Primzahlen {
    public static void main(String [] args) {
        for(int i = 1;i<100;i++) {
            for(int j=1;j<i;j++) {
                if(i%j == 0) {break;}
                if(j== (i-1)) {System.out.println(i);}  
            }           
        }
    }
}

但是如果我尝试运行程序,输出是空的。

【问题讨论】:

  • 你调试过你的程序吗?
  • @Stultuske 它编译
  • 任何%1 都是零。您可以通过调试器单步执行来找到它。
  • 如果代码无法编译,调试器将无法帮助您。当你运行它时,它会让你看到发生了什么。
  • @New2Math 调试和编译是两件不同的事情。调试是在执行时,一步一步地检查正在运行的代码,看看发生了什么

标签: java primes


【解决方案1】:

您的代码的问题在于,j 从 1 开始,每个数字都满足 i%j 并且循环中断,因此 j 应该从 2 开始。我会推荐这段代码,它更有效并且运行在O(sqrt(n)) 时间:

public class Primzahlen {
    public static void main(String [] args) {
        for(int i = 2;i<100;i++) {
            for(int j=2;  j < ((int)Math.sqrt(i))+2  ; j++) {
                if(i%j == 0) {break;}
                if(j== ((int)Math.sqrt(i))+1) {System.out.println(i);}
            }

        }
    }

}

【讨论】:

  • 不就是n*log(n)吗?
  • @NtFreX 我的意思是一个特定的数字。
  • 唯一的问题是它没有显示 2 是素数
  • j*j &lt;= i 是一个更简单的内部循环条件。因此,(j+1)*(j+1) &gt; i 是一个更容易打印的条件。
  • @New2Math 99 不是素数 (99= 3*33)
【解决方案2】:

这里有一些建议。

  • 将第一个素数播种为 2。由于 2 是唯一的偶数素数,因此后续候选数只能是奇数。所以从 3 开始,将候选者增加 2。
  • 只检查直到候选的平方根的素数。
  • 由于您正在寻找素数,因此请使用已找到的素数作为除数来测试素数。假设候选人是 17。素数 2、3、5、7、11、13 已经找到。通过应用前面的平方根规则,您需要做的就是查看 17 是否可以被 3 或 5 整除,而不是 2 到 16。如果它可以被任何大于其平方根的素数整除,则它已经被检测到.

如需完全不同的方法,请查看The Sieve of Eratosthenes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多