4

簡単な演習として、素数ジェネレーターを作成することにしました。コードは非常に単純です。

static void generatePrimes (long min, long max)
    {

        bool[] prime = new bool[max + 1];

        for (long i=2; i<max+1; i++)
            prime [i] = true;

        for (long i=2; i<max+1; i++) {
            if (prime [i]) {
                if (i>=min)
                    Console.WriteLine (i);
                for (long j=i*2; j<max+1; j+=i)
                    prime [j] = false;
            }
        }

        Console.WriteLine ();

    }

1..10000 のような入力で問題なく動作します。ただし、max=1000000000 あたりで動作が非常に遅くなります。また、mono は約 1Gb のメモリを必要とします。私には、ちょっと奇妙に思えます: bool[1000000000] は、バイトではなく 1000000000 ビットを取るべきではありませんか? たぶん、私は愚かな間違いを犯しているのではないでしょうか?

4

2 に答える 2

8

コンピュータがアドレス指定できる情報の最小単位はバイトです。したがって、aboolはバイトとして格納されます。1 バイトに 8 つの bool を入れるには、特別なコードが必要です。BitArrayクラスがこれを行います。

于 2012-05-29T16:22:18.330 に答える
4

いいえ。C++ のとは対照的にvector<bool>、C# では の配列boolは の配列ですbools

値をパックする (bool あたり 8 ビット) 場合は、BitArray代わりに a を使用します。

于 2012-05-29T16:22:05.960 に答える