2010-01-01 40 views
11

Câu hỏi là: Tìm tổng của tất cả các số nguyên tố dưới 2 triệu.Tại sao tôi thất bại Project Euler # 10?

Tôi đã làm rất nhiều điều Sieve of Erastothenes và chương trình bên dưới dường như hoạt động với số lượng nhỏ nghĩa là LIMIT khi 10L tạo 17 làm câu trả lời.

Tôi đã gửi 1179908154 làm câu trả lời, như được sản xuất bởi chương trình sau và không chính xác.

Vui lòng giúp chỉ ra vấn đề. Cảm ơn.

#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

cố định bằng cách thay thế lâu dài với lâu dài, và% lu với% llu – idazuwaika

+1

Tôi rất vui vì tôi chạy trong câu hỏi này, tôi đã trải qua nhiều ngày thất vọng về điều này! +1 – DMan

Trả lời

8

Bạn tính số nguyên tố chính xác, nhưng tổng quá lớn (trên 2^32) và sẽ không vừa với khoảng không dài 32 bit chưa ký. Bạn có thể sử dụng số 64 bit (long long trên một số trình biên dịch) để sửa lỗi này.

+0

cảm ơn. Tôi chỉ đơn giản giả định rằng unsigned dài đã quá lớn cho bất kỳ mục đích nào. ngớ ngẩn tôi – idazuwaika

+0

Bạn sẽ gặp phải điều này theo thời gian; có nhiều vấn đề về Euler với số lượng lớn. Đôi khi bạn có thể thực hiện thủ thuật thông minh để tránh sử dụng các loại 'long long' hoặc thậm chí không giới hạn; đôi khi bạn không thể. – Thomas

1

Logic của bạn có vẻ là đúng, nhưng bạn đang rối tung lên với các kiểu dữ liệu và ranges.Check của họ cho dù làm việc này hay không:

#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

Bạn cũng có thể thấy rằng bạn cần cũng sử dụng công tắc biên dịch -std = c99. Tôi đã làm với gcc (GCC) 3.4.5 (mingw-vista special r3).

tức

gcc -Wall -std = c99 -o problem10 problem10.c

Các vấn đề liên quan