2010-01-01 3 views
11

질문 : 2 백만 미만의 모든 소수의 합계를 찾습니다.프로젝트 오일러 # 10에 왜 실패합니까?

나는 Erastothenes 체의 체를 거의 만들었으며, 아래의 프로그램은 작은 숫자 즉, 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

을 – idazuwaika

+1

나는 기뻐요

즉 I 이 질문에 도망 쳤다. 나는 이것에 대해 많은 좌절을 보냈다! +1 – DMan

답변

8

소수는 올바르게 계산되지만 합계는 2^32를 초과하여 너무 크며 서명되지 않은 32 비트 길이는 적합하지 않습니다. 이 문제를 해결하기 위해 64 비트 숫자 (일부 컴파일러에서는 long long)를 사용할 수 있습니다.

+0

감사합니다. 나중에 나는 서명되지 않은 long이 이미 어떤 목적을 위해 너무 크다고 가정했다. 어리석은 나를 – idazuwaika

+0

당신은 때때로 이것을 실행합니다; 큰 숫자의 많은 오일러 문제가 있습니다. 때로는 '길고 길다'또는 무제한 유형을 사용하는 것을 피하기 위해 영리한 속임수를 쓸 수 있습니다. 때때로 당신은 할 수 없습니다. – Thomas

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 %의 LLU와 함께 오래 오래, 그리고 % 루 긴 대체하여 고정

관련 문제