0

ユーザーが指定した範囲内のすべての素数を計算するプログラムを作成しようとしています。ただし、私の方法では、2から指定された範囲までのすべての数値を取得し続けるため、素数の取得が適切に機能していません。どうすればそれを修正できるかについてのアドバイスはありますか?

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();

        boolean isTrue=false;

        while (iter.hasNext())  //WHILE number is more than one  
        {  
            int number1= iter.next();
            for (int i =2; i<= Math.sqrt(number); i++)
            if (number1 % i == 0)
            {  
                isTrue = true;
                break;
            }   

         } // end while     
         if(isTrue)
         {
             iter.remove();
         }
       return setNumbers;
     }
}

ちなみに、ここでテスターを作成したので、プログラムが機能するかどうかをテストできます。

import java.util.Set;


public class PrimeTest
{

   public static void main(String[] args)
   {
      Sieve sifter = new Sieve(100);
      Set<Integer> primes = sifter.getPrimes();
      System.out.println(primes);
      System.out.println("Expected: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 43, 41, 47, 53, 59, 61, 71, 67, 79, 73, 83, 89, 97]");

   }

}
4

2 に答える 2

2

特に効率的なアルゴリズムではありませんが、あなたがしているように独自に設計するのではなく、これを実装することをお勧めします: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

あなたが見つけることができるいくつかのサンプルバージョンがオンラインにあるはずです。

于 2012-04-17T20:37:10.303 に答える
0
     if(isTrue)
     {
         iter.remove();
     }
     isTrue = false;
}//End while

whileループの内側とforの外側に来ます

于 2012-04-17T20:35:27.663 に答える