在输出中,我得到9
我应该得到11
!
这是在第五次调用nextPrime()
之后发生的。除了第5个输出外,其他所有输出都是正确的!我一直在努力确定我的错误几个小时了。对不起,如果我的代码很草率,这是我的想法找出问题的方式!需要使用标志控制循环。
public class PrimeGenerator
{
private int num = 2;
public PrimeGenerator()
{
}
public int nextPrime()
{
boolean done = false;
for (int n = num; !isPrime(num); n++)
num = n;
if (isPrime(num))
{
done = true;
}
if (done)
{
int prime = num;
num++;
return prime;
}
return num;
}
public static boolean isPrime(int n)
{
boolean result = true;
for (int i = 2; n % i == 0 && i < n; i++)
result = false;
if (n == 2)
result = true;
return result;
}
}
我的测试人员只调用nextPrime()
方法并打印结果。
答案 0 :(得分:1)
您的nextPrime
方法会返回num
,无论它是否为素数。您的代码是有效的:
if(isPrime(num))
return num;
}
return num;
答案 1 :(得分:1)
你得到9而不是11,因为你在方法isPrime
public static boolean isPrime(int n)
{
boolean result = true;
for (int i = 2; n % i == 0 && i < n; i++)
result = false;
if (n == 2)
result = true;
return result;
}
查找号码9
。
第一次迭代:i = 2,result = true
n%i =&gt; 9%2 = 1,因此您的循环在第一次迭代之前停止,result
没有改变。
尝试更改方法isPrime
(在评论中更新为评论@John)
public static boolean isPrime(int n)
{
if( n % 2 == 0 ) {
return false;
}
double root = Math.sqrt(n);
for ( int i = 3; i < root; i+=2 ) {
if( n % i == 0 ) {
return false;
}
}
return true;
}
答案 2 :(得分:0)
因此,您的代码的主要问题是检查数字是否为素数的方法。根据数论,你只需要检查给定的数字是否不能被2之间任何数字整除,你要确定的给定数字的根是素数。更正式的是,如果要检查数字n是否为素数,则需要检查n是否不能被2和sqrt(n)之间的任何数字整除。 使用此数论的更新方法如下:
public static boolean isPrime(int n)
{
int root = (int)Math.sqrt(n);
for (int i = 2; i <= root; i++) {
if(n % i == 0) {
return false;
}
}
return true;
}
有了这个,您对素数的确定将是正确的并且会更快。甚至有更快的方法来确定素数和生成素数,如筛子的算法。