2

配列の使用が必要な割り当てに問題があります。エラトステネスのふるいアルゴリズムを作成し、すべての素数を出力する必要があります。私が知る限り、操作の順序は正しいので、かなり混乱しています。コードは次のとおりです。

        //Declare the array
        boolean numbers [] = new boolean[1000];
        int y = 0;

        //Declare all numbers as true to begin
        for(int i = 2; i < 1000;i++){
            numbers[i] = true;
        }
        //Run loop that increases i and multiplies it by increasing multiples
        for (int x = 2; x < 1000; x++) {

            //A loop for the increasing multiples; keep those numbers below 1000
            //Set any multiple of "x" to false
            for(int n = 2; y < 1000; n++){
            y = n * x;
            numbers[y] = false;
            }
        }

まず、配列内のすべての数値を true に設定します。次に、2 番目のループは "x" を 2 で開始し、その内部で "x" を "n" の値で乗算するネストされたループであり、"n" はその乗算の積 ("y ") は 1000 を下回っています。"y" がその最大値に達すると、"x" は 1 数値上がり、素数以外の数値がすべて false に設定されるまでこのプロセスが繰り返されます。

コードを作成したときはこれが私のロジックでしたが、実行しようとすると「ArrayIndexOutOfBoundsException」エラーが発生します。私が言えることから、すべてを1000未満に保つように設定したので、配列サイズを超えてはいけません。

「x」が増加すると、すでに超えている数値を超えるため、おそらく最も効率的なアルゴリズムではないことはわかっていますが、これは私が考えることができる最も単純なものでした。

4

1 に答える 1

4

ここ:

        for(int n = 2; y < 1000; n++){
        y = n * x;
        numbers[y] = false;
        }

最初にそれを確認してy < 1000から、初期化して使用します。これは間違った方法です。

xまた、が素数の場合にのみ上記のループを実行することで回避できます。これは正確性には影響しませんが、コードを大幅に高速化するはずです。

于 2013-03-06T14:59:46.747 に答える