1

刚开始学习java,我不明白我的代码有什么问题。PrimeIterator应该生成无限数量的素数(从数字 3 开始),但是当我打印输出时,我得到:3、5、7、9、11、13、15 等。

public class Prime {

    PrimeIterator iter = new PrimeIterator();

    private class PrimeIterator implements java.util.Iterator<Integer>
    {
        int numb = 1;

        public boolean hasNext() 
        {
            return true;
        }

        public Integer next() 
        {
            nextCandidate:
            do{
                numb += 2;
                int numbSqrt = (int)java.lang.Math.sqrt(numb);

                for (int i = 3; i <= numbSqrt; i = i+2)
                {
                    if (numb % i == 0)
                    {
                        continue nextCandidate;
                    }
                }
            }while(false);
            return numb;
        }

        public void remove() {}
    }

    void printPrimes()
    {
        System.out.print(2);
        while(iter.hasNext())
        {
            try 
            {
                Thread.sleep(500);
            } catch (InterruptedException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.print(", " + iter.next());   
        }
    }
}

我想为我的 do-while 循环使用标记为“继续”的语句。但是我的直觉告诉我,我用错了。

4

2 回答 2

1

问题在于while(false)延续条件。作为一个do while(false)语句,这意味着它不能循环超过一次。也就是说,当您尝试将执行跳转到带标签的语句时,它不会再次循环执行,do while因为未验证继续条件 ( false),即使您认为这continue会使执行再次循环。

所以每次方法执行它永远不会增加numb一次以上。next()

我会做如下的事情:

nextCandidate:
do{
    numb += 2;
    int numbSqrt = (int)java.lang.Math.sqrt(numb);

    for (int i = 3; i <= numbSqrt; i = i+2)
    {
        if (numb % i == 0)
        {
            continue nextCandidate;
        }
    }
    break;

}while(true);
于 2014-02-21T16:38:25.597 回答
1

这是我看到的问题

  1. 你甚至没有打印输出。

  2. (int)java.lang.Math.sqrt(5)最终将截断为2. 您应该将 1 添加到您的平方根,因为如果您没有足够的迭代,这是一个问题,但如果您迭代的次数超过了您的需要,这不是问题。

  3. 当你找到一个素数时,你的for循环将结束,while(false)并将终止 do-while 循环

于 2014-02-21T16:38:43.797 回答