0

指定された長さの素数のセットを出力するアプリケーションを作成しています。これは、1 から 100 までのすべての数字など、一般的な長さのアプリケーションです。

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;


public class Sieve
{
    private int number;

    public Sieve (int maxPrime)
    {
        number = maxPrime;
    }

    public Set<Integer> getPrimes()
    {
        Set<Integer> setNumbers = new TreeSet<Integer>();


        for(int i=2; i<=number; i++)
        {
            setNumbers.add(i);
        }

        Iterator<Integer> iter = setNumbers.iterator();

        while(iter.hasNext())
        {
            int number1 = iter.next();

            for( int i = 2; i <= Math.sqrt(number); i++ )
            {
                if( number1 % i == 0)
                {
                    iter.remove();
                }
            }

        } 
        return setNumbers;
    }
}

エラーが発生している部分は、if ステートメント内の部分です。それは illegalStateException と言います。誰かがこの問題を解決する方法を理解するのを手伝ってもらえますか?

4

1 に答える 1

1

removeの間にメソッドを複数回呼び出していますnextドキュメントから:

「IllegalStateException - 次のメソッドがまだ呼び出されていない場合、または次のメソッドへの最後の呼び出しの後に remove メソッドが既に呼び出されている場合」

そのはず:

bool isComposite = false;

for( int i = 2; i <= Math.sqrt(number1); i++ )
{
    if( number1 % i == 0)
    {
        isComposite = true;
        break;
    }
}

if(isComposite)
{
    iter.remove();
}

アルゴリズムのバグは、考慮している現在の素数でnumberある の根ではなく、 の平方根 (考慮できる最大の素数) になることです。number1つまり、sqrt(100) より小さく、2 の倍数であるため、2 を除外します。

これは、より適切な変数名を使用する必要があるという兆候です。

于 2012-04-05T03:26:42.690 に答える