1
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.

そして私の答えは:

bool IsRishoni;
int soap = 0;
for (int i = 3; i < 2000000; i++)
{
    IsRishoni = true;
    for (int a = 2; (a <= Math.Sqrt(i)) && (IsRishoni); a++)
    {
        if (i % a == 0)
            IsRishoni = false;
    }
    if (IsRishoni)
    {
        soap = i + soap;
    }
}
Console.WriteLine(soap + 2);
Console.ReadLine();

なぜこれが機能しないのですか?私が得た答えは1179908154です...助けてください。

4

3 に答える 3

6

交換

soap = i + soap;

soap = checked(i + soap);

..そして問題が明らかになるはずです。

この質問には詳細があります:C#のintのオーバーフロー例外はありませんか?

于 2012-04-28T08:11:02.483 に答える
2

あなたの答え ( に保存されている) は(2,147,483,647)soapより大きい値です。int.Maxvalue

あなたの答えは ~ 150,000,000,000 です

つまり、それよりも大きなデータ型を使用する必要があります。

long.MaxValue = 9,223,372,036,854,775,807
int.Maxvalue = 2,147,483,647
于 2012-04-28T08:05:09.027 に答える
1

求めている結果が大きすぎて、32 ビットの符号付き整数 ( int) で表すことができない場合があります。

最初に、すべての数値が素数であると仮定して、結果の上限を決定しましょう。合計により、 までのNすべての数値の合計が であることがわかりN * (N + 1) / 2ます。したがって、2,000,000 までのすべての素数の合計の上限は 2,000,001,000,000 です。これは、2,147,483,647 で許可されている最大値よりも大きいintため、数値のオーバーフローが発生している可能性がありますが、これは黙って無視されます。

より正確な答えの推定が必要な場合は、素数定理を使用できます。これは、0 と素数の間のランダムな整数の確率Nが約であることを示しています1 / ln(N)。これを前の式と組み合わせると、 までのすべての素数のおおよその合計Nは ですN * (N + 1) / (2 * ln(N))。2,000,000 の場合、これは約 138,000,000,000 と評価されますが、これは の最大値よりもまだ大きいですint

問題を解決するには、soap変数に使用している整数データ型をlong. その最大値は 9,223,372,036,854,775,807 であるため、間違いなくあなたの番号を表すことができます。

long soap = 0;

別のメモ:素数のシーケンスを使用しているため、実装をSieve of Eratosthenesに変更すると、パフォーマンスが大幅に向上します (少なくとも 100 倍) 。

于 2012-04-28T08:29:53.703 に答える