2012-04-28 44 views
1
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. 

Find the sum of all the primes below two million. 

而我的回答是:項目歐拉數10#

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 ...請幫助。

+0

你應該得到什麼答案? – 2012-04-28 08:00:53

+2

他還不知道答案(這是他試圖解決的問題!),我不會破壞它,但答案是<100000 – inspite 2012-04-28 08:02:41

+0

@ DD59不,它比這更大。 – 2012-04-28 08:04:19

回答

6

更換

soap = i + soap; 

soap = checked(i + soap); 

..和問題予以曝光。

這個問題進行了詳細介紹:No overflow exception for int in C#?

+0

那麼我的代碼有什麼問題? – idik 2012-04-28 08:23:38

+2

恩,這個問題在你被賦予鏈接的那個問題中描述。你讀過了嗎? – 2012-04-28 08:27:41

+1

我認爲歐拉問題的關鍵在於親身體驗計算的各個方面,所以我不會準確地告訴你問題是什麼。嘗試一下上面的更改,然後從那裏繼續。 – 2012-04-28 08:35:54

2

您的回答(存儲在soap)的值大於int.Maxvalue(2,147,483,647)。

你的答案是〜1500億

換句話說,你需要使用的數據類型,這比大。

long.MaxValue = 9,223,372,036,854,775,807 
int.Maxvalue = 2,147,483,647 
1

你以後可能過大,通過一個32位有符號整數(int)來表示結果。

我們首先通過假設所有數字都是素數來確定結果的上限。通過summation,我們知道所有數字之和達到N(含)之和爲N * (N + 1)/2;因此,高達2,000,000的所有質數的總和的上限是2,000,001,000,000。這大於int,2,147,483,647所允許的最大值,所以你可能會得到一個數字溢出,它被默默地忽略。

如果您想更準確地估計您的答案,可以使用prime number theorem,其中指出0到N之間的隨機整數的概率爲大約1/ln(N)。結合我們之前的公式,所有質數最高爲N的近似總和爲N * (N + 1)/(2 * ln(N))。對於2,000,000,這估計爲大約138,000,000,000,這仍然大於int的最大值。

要解決您的問題,您可以簡單地將您用於soap變量的整數數據類型切換爲64位整數表示形式,如long。它的最大值是9,223,372,036,854,775,807,所以它一定能夠代表你的電話號碼。

long soap = 0; 

在一個單獨的說明:由於您使用序列素數工作,你可以,如果你改變你實現一個Sieve of Eratosthenes實現了巨大的性能增益(至少100倍)。