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 ループにラベル付きの「continue」ステートメントを使用したかったのです。しかし、私の直感は、私がそれを間違って使用していることを教えてくれます.

4

2 に答える 2

1

ここに私が見る問題があります

  1. 出力を印刷していません。

  2. (int)java.lang.Math.sqrt(5)に切り捨てられ2ます。十分に反復しないと問題になるため、平方根に 1 を追加する必要がありますが、必要以上に反復しても問題にはなりません。

  3. 素数が見つかると、forループがwhile(false)終了し、do-while ループが終了します

于 2014-02-21T16:38:43.797 に答える