2015-05-08 10 views
6

Il mio codice è di sotto. funziona perfettamente mentre l'intervallo non è molto grande. Comunque ogni volta che vado oltre un milione il programma si ferma. ad esempio per gli intervalli da 2 a 2000000 la somma dei numeri primi deve essere 142913828922 (dal retro del libro) mentre la mia applicazione mostra 1179908154. qualcuno può indicare per favore dove ho sbagliato.Ricerca di una somma di numeri primi tra un intervallo (il programma C++ non funziona per grandi numeri)

#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' e long' può contenere solo numeri così grandi. –

+5

Il valore massimo che un 'long' può contenere è 2147483647. Ovviamente il risultato desiderato è più grande di quello. Dovrai utilizzare il tipo di dati appropriato. –

+0

Probabile overflow –

risposta

4

Il problema si sta trattando è integer overflow.

(signed) long può sulla maggior parte delle macchine avere valori compresi tra -2147483647 e 2147483647.

si dovrebbe usare più grande tipo di dati, vorrei suggerire unsigned long long, che, sulla maggior parte delle macchine, può contenere valori compresi tra: 0-18446744073709551615 (almeno 64 bit) o ​​uint64_t tipo.

+1

'uint64_t' non è più portabile. 'unsigned long long' è garantito che abbia almeno 64 bit. Non vi è alcuna garanzia che esista un tipo con * esattamente * 64 bit. E ovviamente, avere più bit non fa male qui. Tipi come 'uint64_t' dovrebbero essere limitati alle rare applicazioni in cui è importante l'esatta dimensione del bit. – celtschk

+1

Puoi anche scegliere di usare 'uint64_fast_t' o' uint64_least_t', ma sono brutti e quasi mai usati. È piuttosto raro che una piattaforma supporti un tipo intero di dimensioni superiori a 64 bit, ma non supporta un tipo intero di esattamente 64 bit. Inoltre, tieni presente che alcune persone considerano l'utilizzo di dimensioni intere specifiche una buona pratica, in questo modo il codice non si comporterà in modo diverso su piattaforme diverse. Ad esempio, Java e .NET hanno risolto le dimensioni dei tipi interi indipendentemente dalla piattaforma sottostante, e questo è probabilmente uno dei razionali (anche se ammetto che non ho una citazione per quello pronto). –

1

è necessario sostituire tutte le occorrenze di 'int' e 'lungo' con 'uint64_t'