【问题标题】:Program that checks if given number is prime number检查给定数字是否为素数的程序
【发布时间】:2013-11-18 21:46:20
【问题描述】:

你好,我有一个小程序检查给定的数字是否是素数,但我不明白 for 循环中的某些部分,我需要你的帮助。 这是代码:

public class PrimeNumber
{
    public static void main(String args[])
    {

        int number;
        boolean prime;
        /*
            *is a natural number greater than 1 that has no positive divisors other 
            *than 1 and itself.
            * such as: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 
            * 61, 67, 71, 73, 79, 83, 89, 97, 101, and so on.
            */
        number =23;

        if(number<2)  
            prime=false; 
        else
            prime=true; 
        for(int i=2; i <=number/2; i++) 
        {
            if ((number%i) ==0) 
            { 
                prime =false; 
                break;
            }
        }
        if(prime) System.out.println("It is prime number");
        else System.out.println("it is not prime number");
    }
}

我知道首先 if 函数检查给定的数字是否大于 2,如果不是 素数将为假,如果素数将为真。 然后在 for 循环中我认为 int 是 2 因为 2 是可能的最小素数? 我理解

【问题讨论】:

  • 代码写得不好,所以我不能告诉你为什么要这样做,而不是使用更有效和广泛可用的解决方案。如果您想了解您的代码,我建议您尝试使用调试器或更改它,看看它有什么不同。
  • 当你说we 它引出了问题;你为什么不问问写这篇文章的人为什么要这么做?
  • 是的,可能有更好的解决方案,但我不知道,我只是初学者,这是我第一次为素数编写程序。
  • @Milan 恕我直言,你应该扔掉那本书。当在这样的算法上发生这样的错误时,我担心更重要的事情无法处理。如果数字是偶数,则首先检查数字,然后循环for(int i=3; i &lt;=sqrt(number); i=i+2)

标签: java primes


【解决方案1】:

作者只检查到n/2,因为如果2 是可能的最小因子,那么n/2 是最大可能的因子 除数(?)。虽然它不是最大的可能因素,但算法编写者确信没有任何因素可能大于n/2

然后作者使用n % i == 0 来检查该数字是否可以被范围内的任何数字整除。如果是,那肯定不是素数。

请记住,这不是质数检查的最有效方法。见Which is the fastest algorithm to find prime numbers?

【讨论】:

  • 其实最大可能的整除数是ceil(sqrt(number)),而不是number/2
  • 其实26的最大非平凡除数是13,比ceil(sqrt(26))还大。
  • @DonRoby 如果你是技术人员,26 的最大因数是 26 :)。
  • @DonRoby 虽然是这样,但你会更早地消除 26,因为它可以被 2 整除。
  • 效率低下,因为您只需要检查直到 ceil(sqrt(number)) 的因子,因为任何大于该值的因子都已被隐式检查,因为它需要与小于该值的因子配对。
【解决方案2】:

你需要检查number除了1和它本身之外没有任何除数, 如果您检查了直到number/2 之前的所有整数,那么显然,您不需要检查更多数字,因为如果number/i 不是除数,i 不能是i&gt;number/2number 的除数。

同样的逻辑,你可以通过替换这一行来提高效率:

 for(int i=2; i <=number/2; i++) 

用这一行:

for(int i=2; i <=sqrt(number); i++) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2017-03-05
    • 2013-03-22
    • 2014-06-10
    • 2022-06-25
    • 1970-01-01
    相关资源
    最近更新 更多