繁体   English   中英

搜索素数的方法

[英]Method to search for prime numbers

我需要建立一种计算素数的方法。

我正在测试它,它给了我错误的答案,我不知道如何解决! 例如,它返回true到98262679而不是false 我的错误在哪里?

public static boolean itsPrime(int nbTest){   // Tests for prime numbers method

        boolean prime = false;

        if (nbTest <= 1){
             return false;
        } else if (nbTest == 2){     // Two is prime   
            return true;
        } else if ((nbTest != 2) && (nbTest % 2 == 0)){       // Evens except number 2
            return false;                                     // are not prime
        } else if (nbTest % 2 != 0){    // For all remaining odds
            for(int i = 3; i <= Math.sqrt(nbTest); i = i+2){ 
                if (nbTest % i == 0){
                    prime = false;
                } else {
                    prime = true;
                }
            }   
        }

        return prime; 
    }

我正在学习Java,我的教授要求我们构造基于此的itsPrime方法:

    For the first subtask, write a function `itsPrime` that takes an `int` 
            as argument and returns a `boolean`, `true` if the argument integer is prime 
        and `false` otherwise.

                To test whether an integer x is prime, one can proceed as follows:
                all integers less than or equal to 1 are not prime;
                2 is prime;
                all other even integers are not prime;
                for all remaining integers (obviously odd), search for a divisor:

                loop from 3 to the square root of the integer x (The square root of x can 
    be computed as ‘‘Math.sqrt(x)'' in Java.); if the remainder of the integer 
division of x by the loop index is zero, then x is not prime;
 if all remainders were non-zero at the end of the loop, then x is prime; 

您一旦在这里就应该停止:

if (nbTest % i == 0){
   return false;
}

删除prime变量(这是不必要的步骤,请参见下文)。

更改for循环:

for(int i = 3; i <= Math.sqrt(nbTest); i = i+2){ 
    if (nbTest % i == 0){
        prime = false;
    } else {
        prime = true;
    }
}

对此:

for(int i = 3; i <= Math.sqrt(nbTest); i = i+2)
    if (nbTest % i == 0)
        return false;

如果不是素数(如果已找到一个因数),这会很早就脱离该函数。

我知道上述所有答案中都有答案,但是我认为每个答案都需要解释。

这是您可以对代码进行的所有增强的摘要:

1)不要声明要返回的布尔值,因为您已经在整个代码中返回了true或false。 从您的代码中删除此行(将其命名为[1]):

boolean prime = false;

修复其余功能后,您将看到为什么。 暂时将其注释掉。

2)在第二个else if ,我们称它为[2],您具有:

else if ((nbTest != 2) && (nbTest % 2 == 0)){
    return false;
}

您已经在第一个else if检查了if nbTest is 2 ,因此您无需再次检查其是否不是2。 如果输入的第一个if else ,你的函数将返回true 当一个函数返回时,它就完成了。 它将值返回给调用方,其余代码未执行。

因此,你可以更换第二if else ,[2],其中:

else if (nbTest % 2 == 0) { // all other even integers are not prime
    return false;
}

3)如果您输入else if第三,则意味着上面的其余代码已经执行,或者返回,或者程序继续执行。

else if (nbTest % 2 != 0){对于:

else {

4)这是您真正要使函数返回错误答案的错误(调用此代码段[4]):

if (nbTest % i == 0){
    prime = false;

如果发现要测试的数字是可分割的(即余数为零),则操作完成。 您肯定知道它不是素数。

您可以将以下代码[4]替换为:

if(nbTest % counter == 0) {
    return false;
}

因此,返回false。 这不是数字。 并且该功能不会持续执行。 函数发现您的输入不是素数后,您的错误是继续执行。

最后,您可以在函数主体的末尾保留自己的return true 如果函数从以前的测试或循环中从未返回过,则它必须是质数。 还记得我告诉您删除的第一行吗? 布尔声明? 由于您从不从变量返回值,因此只返回truefalse ,因此不需要该[1]行。

另外,您还可以阅读有关寻找质数的好书,您可能希望与教授分享:

https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

一旦将数字的prime设置为false,就不应继续测试primity。

更换:

if (nbTest % i == 0){
    prime = false;

有:

if (nbTest % i == 0){
    return false;

最后的测试是没有用的,您可以保留其他基本内容:

else if (nbTest % 2 != 0){ => else {

您的for循环不正确。

质数是一个只能被1整除的数字。 因此,如果数字A可以除1和本身以外的任何其他数字整除,那么A是非质数。

只需将您的for循环替换为下面的一个

for(int i = 3; i <= Math.sqrt(nbTest); i = i+2) {
    if (nbTest % i == 0)
      return false;
}

一旦发现nbTest可被某个数整除,就没有必要继续循环了。 返回`nbTest是非素数,然后到那里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM