我无法弄清楚PrimeGenerator中的错误

时间:2014-02-17 18:46:04

标签: java

在输出中,我得到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()方法并打印结果。

3 个答案:

答案 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;
}

有了这个,您对素数的确定将是正确的并且会更快。甚至有更快的方法来确定素数和生成素数,如筛子的算法。