[英]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
。 如果函数从以前的测试或循环中从未返回过,则它必须是质数。 还记得我告诉您删除的第一行吗? 布尔声明? 由于您从不从变量返回值,因此只返回true
或false
,因此不需要该[1]行。
另外,您还可以阅读有关寻找质数的好书,您可能希望与教授分享:
一旦将数字的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.