2010-01-01 63 views
11

問題是:找到200萬以下所有素數的總和。爲什麼我失敗Project Euler#10?

我幾乎做了Erastothenes的東西,下面的程序似乎適用於小數字,即定義LIMIT,因爲10L產生17個答案。

我提交了1179908154作爲答案,由以下程序生成,它是不正確的。

請幫忙指出問題。謝謝。

#include <stdio.h> 

#define LIMIT 2000000L 
int i[LIMIT]; 

int main() 
{ 
    unsigned long int n = 0, k, sum = 0L; 
    for(n = 0; n < LIMIT; n++) 
     i[n] = 1; 
    i[0] = 0; 
    i[1] = 0; 

    unsigned long int p = 2L; 

    while (p*p < LIMIT) 
    { 
     k = 2L; 
     while (p*k < LIMIT) 
     { 
      i[p*k] = 0; 
      k++; 
     } 
     p++; 
    } 

    for(n = 0; n < LIMIT; n++) 
     if (i[n] == 1) 
     { 
      sum += n; 
     } 
    printf("%lu\n",sum); 

    return 0; 
} 
+1

通過用長長,和%陸用%LLU替換長固定 – idazuwaika 2010-01-01 14:59:17

+1

我很高興我在這個問題上跑,我花了很多挫折的日子! +1 – DMan 2010-05-07 00:33:45

回答

8

您可以正確計算素數,但總和過大(超過2^32),並且不適合無符號的32位長。您可以使用64位數(某些編譯器上的long long)來解決此問題。

+0

謝謝。遐我只是假設長簽名已經太大了,無法用於任何目的。傻我 – idazuwaika 2010-01-01 15:01:07

+0

你會不時碰到這個;有大量的歐拉問題。有時候,你可以巧妙地使用欺騙手段來避免使用「long long」或甚至無限制的類型;有時你不能。 – Thomas 2010-03-30 12:25:55

1

你的邏輯似乎是正確的,但你搞亂與數據類型及其ranges.Check這是否工作:

#include <stdio.h> 

#define LIMIT 2000000 
int i[LIMIT]; 

int main() 
{ 
    long long int n = 0, k, sum = 0; 
    for(n = 0; n < LIMIT; n++) 
    i[n] = 1; 
    i[0] = 0; 
    i[1] = 0; 

    long long int p = 2; 

    while (p*p < LIMIT) 
    { 
    k = 2; 
    while (p*k <LIMIT) 
    { 
     i[p*k] = 0; 
     k++; 
    } 
    p++; 
    } 

    for(n = 0; n < LIMIT; n++) 
    if (i[n] == 1) 
    { 
     sum += n; 
    } 
    printf("%lld\n",sum); 

    return 0; 
} 

Output :142913828922

0

您也可能會發現,你需要以便使用編譯器開關-std = c99。我用gcc(GCC)3.4.5(mingw-vista special r3)

GCC -Wall -std = C99 -o problem10 problem10.c