搜索素数的方法

时间:2015-10-31 14:30:48

标签: java methods

我需要构建一个计算素数的方法。

我正在测试它并且它给了我错误的答案,我不知道如何解决它!例如,它会将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; 

5 个答案:

答案 0 :(得分:1)

你应该在这里停下来:

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

答案 1 :(得分:1)

删除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;

如果它不是素数(如果找到了一个因子),那么它就会早期突破该函数。

答案 2 :(得分:1)

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

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

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

boolean prime = false;

在您修复完其余功能后,您将会明白为什么。如果需要,请暂时注释掉。

2)在你的第二个else if中,让我们称之为[2],你有:

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

您已在第一个if nbTest is 2中检查了else if,因此您无需再次检查它是否为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

答案 3 :(得分:0)

对于数字,一旦将prime设置为false,就不应该继续测试素数。

替换:

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

with:

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

最后一次测试没用,你可以保留一个基本的其他测试:

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

答案 4 :(得分:0)

你的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是nonprime,然后那里。