2

Javaでエラトステネスのふるいを作成しようとしていますが、作成したコードに欠陥があるようです。私にはできないので、他の誰かが私の間違いを見つけることができるかどうか疑問に思いました。私が得る出力は単純に[2]であり、これは私のメインループが機能しないことを意味します。私はJavaを始めたばかりなので、詳細な回答をいただければ幸いです。

私のコード:

public static int[] primes(int n)
{
    //Variable assignement
    double sqrt;
    List<Integer> primes= new ArrayList<Integer>();
    //Adds 2 to primes so i don't need to include the even numbers in my for loop.
    if(n>1)
    {
        primes.add(2);
    }
    //For loop that goes through the oneven numbers up to n
    for(int counter1=3;counter1<=n;counter1+=2)
    {
        sqrt=Math.floor(Math.sqrt(0.0+counter1));
        //for loop that tests if the first for loops number is prime
        for(int counter2=0;sqrt<=primes.get(counter2);counter2++)
        {
            if(counter1 % primes.get(counter2) != 0 && counter2 ==sqrt)
            {
                primes.add(counter1);
            }

            if(counter1 % primes.get(counter2)==0)
            {
                break;
            }
        }
    }
    return convertIntegers(primes);
}
//Converts the list to an array
public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    for (int i=0; i < ret.length; i++)
    {
        ret[i] = integers.get(i).intValue();
    }
    return ret;
}
4

2 に答える 2

3
if(counter1 % primes.get(counter2)==0);{
    break;}
}

問題を解決する可能性は低いです。オープニングブレースの前にセミコロンがあります-ブレークは常に実行されます。

于 2012-04-10T12:35:26.860 に答える
2

コードを徹底的にチェックしませんでしたが、精度に問題がある可能性があります。double整数値を正確に表していない可能性があるため、整数のように見えてcounter2 ==sqrtもfalseになる可能性があることに注意してください。sqrt

これを防ぐには、次のことを試してください。

//this is not necessarily a square root anymore, btw :)
int sqrt = (int) Math.floor( Math.sqrt( (double)counter1 ) );
...
for( ... ) {
  ...
  if(... && counter2 ==sqrt ) {
    ...
  }
  ...
}

編集

もう少し分析を行うと、次のようになります。

n = 5と仮定すると、次の手順がコードで実行されます。

  1. counter1 = 3
  2. sqrt = 1 // floor(sqrt(2))
  3. counter2 = 0
  4. counter1 % primes.get(counter2) != 0 && counter2 ==sqrtしかし3 % 2 = 10 != 1
  5. counter1 % primes.get(counter2)==0以来false3 % 2 = 1
  6. counter2 = 1(次の反復)
  7. primes.get(counter2)少なくとも2つの要素がprimes.get(1)必要なため、例外をスローします。primes

あなたが試みるかもしれないのはcounter2 <=sqrt代わりです。

于 2012-04-10T12:48:17.167 に答える