2015-05-08 17 views
6

Mój kod znajduje się poniżej. działa idealnie, a interwał nie jest zbyt duży. Jednak za każdym razem, gdy przekraczam milion, program się zatrzymuje. na przykład dla przedziału od 2 do 2000000 suma liczb pierwszych powinna wynosić 142913828922 (z tyłu książki), podczas gdy moja aplikacja pokazuje 1179908154. Czy ktoś może wskazać, gdzie się pomyliłem.Znajdowanie sum liczb pierwszych między interwałami (program C++ nie działa dla dużych liczb)

#include <iostream> 
#include <math.h> 
#define BELOW 2000000; 

using namespace std; 
bool isPrime(int num) 
{ 
    int i; 

    for (i = 2; i <= sqrt(num); i++) { 
     if (num % i == 0) { 
      return 0; 
     } 
     else { 
      ; 
     } 
    } 
} 

int main() 
{ 
    long sum = 0; 
    for (int i = 2; i < BELOW i++) { 
     if (isPrime(i)) { 
      sum = sum + i; 
      printf("sum: %ld\n", sum); 
     } 
    } 

    cin.get(); 
    return 0; 
} 
+0

'int' i' long' może przechowywać tylko tak duże liczby. –

+5

Maksymalna wartość jaką może pomieścić 'long' to 2147483647. Oczywiście pożądany wynik jest większy. Będziesz musiał użyć odpowiedniego typu danych. –

+0

Prawdopodobna przepełnienie –

Odpowiedz

4

Problem, z którym masz do czynienia to integer overflow.

(signed) long może na większości maszyn mieć wartości między -2147483647 i 2147483647.

Należy zastosować większy typ danych, chciałbym zaproponować unsigned long long, który na większości komputerów, może pomieścić wartości pomiędzy: 0 do 18446744073709551615 (na co najmniej 64 bitów) lub uint64_t typu.

+1

'Uint64_t' nie jest bardziej przenośny. "unsigned long long" ma co najmniej 64 bity. Nie ma gwarancji, że istnieje typ z * dokładnie * 64 bitami. I oczywiście posiadanie większej ilości bitów tutaj nie szkodzi. Typy takie jak "uint64_t" powinny być ograniczone do rzadkich aplikacji, w których liczy się dokładny rozmiar bitów. – celtschk

+1

Można również użyć 'uint64_fast_t' lub' uint64_least_t', ale są one brzydkie i rzadko używane. Bardzo rzadko zdarza się, aby platforma obsługiwała typ całkowity większy niż 64 bity, ale nie obsługuje typu integer o dokładnie 64 bitach. Należy również pamiętać, że niektórzy ludzie uważają, że używanie określonych wielkości całkowitych jest dobrą praktyką - w ten sposób kod nie będzie zachowywał się inaczej na różnych platformach. Na przykład, Java i .NET naprawiły rozmiary typów całkowitych, niezależnie od platformy bazowej, i jest to prawdopodobnie jedna z racji (choć przyznam, że nie mam cytatu na ten temat). –

1

Powinieneś zastąpić wszystkie wystąpienia "int" i "long" za pomocą "uint64_t"

Powiązane problemy