2

私はこのコードを持っています:

int[] primes = generatePrimes(bound);

int sum = 0;
for (int i = 0; i < primes.GetLength(0); i++)
{
    if (sum < 0)
    {
        Console.WriteLine(sum);
    }
    sum += primes[i];
}

配列「素数」に次のような正の整数のみが含まれていることを確認しました。

if (primes[i] < 0)
{
    Console.WriteLine(primes[i]);
}

しかし、何も印刷されません。ただし、何らかの理由で合計が負になることがあり、最初のコードを実行すると出力されます。配列の長さは 148933 です。私は C# についてあまり詳しくありませんが、ここで長さが問題になるとは思いませんでしたか? :S

なぜこれが起こっているのか誰かが知っているなら、私はどんな助けにも感謝します.

4

3 に答える 3

6

配列の長さは 148933 です。

ほとんどの場合、合計が int (-2,147,483,648 to 2,147,483,647)の可能な値を超えているため、負の数値が表示されます。

long合計の計算に使用します。ただし、合計を計算するにはBigIntegerが必要になる場合があります。

于 2014-07-10T14:00:52.437 に答える
0

最初の 21000 個の素数の合計は 2 368 647 159 です (Wolfram Alpha による)。この値は、32 ビットの符号付き整数には収まりません。負の数として表示されます。

最初の 148933 個の素数の合計は 142 913 828 922 です。これは 64 ビット整数として表すことができます。

32 ビットの数値で計算した合計はどれも間違っており、大きさに応じて正または負になる可能性があります。

于 2014-07-10T14:49:57.457 に答える
-1
if (primes[i] < 0)
    {
        Console.WriteLine(primes[i]);
    }

これは、配列に正の数だけがあることを保証するものではなく、負の素数がある場合にのみ通知します。

マイナスを合計に含めたくない場合は、これを試してください。

for (int i = 0; i < primes.GetLength(0); i++)
{
    if (sum >= 0)
    {
        sum += primes[i];
    }
}
于 2014-07-10T14:15:30.890 に答える