我需要构建一个计算素数的方法。
我正在测试它并且它给了我错误的答案,我不知道如何解决它!例如,它会将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;
答案 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
留在功能正文的末尾。如果函数从未从先前的测试或循环中返回,则它必须是素数。还记得第一行我告诉你要删除吗?布尔声明?由于您永远不会从变量返回值,只需返回true
或false
,您就不需要[1]行。
作为一个额外的,很好地阅读寻找素数,你可能想与你的教授分享:
答案 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,然后那里。