2015-05-08 23 views
6

Kodum aşağıdadır. çok büyük olmayan aralıkta mükemmel çalışır. Ancak, bir milyonu aştığımda program durur. Örneğin, 2 ile 2000000 arasındaki aralıkların toplamı 142913828922 (kitabın arkasından) olmalıdır, oysa başvurum 1179908154'ü gösterir. Birisi nerede yanlış gittiğimi işaret edebilir.Aralıklar arasındaki Asal Sayıların Toplamını Bulma (C++ programı büyük sayılar için çalışmaz)

#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' ve' long' ile 'uzun' tüm tekrarlarını değiştirmek gerekir. –

+5

Bir 'long'un tutabileceği maksimum değer 2147483647'dir. Açıkçası, istediğiniz sonuç bundan daha büyüktür. Uygun veri türünü kullanmanız gerekecek. –

+0

Olası taşma –

cevap

4

Karşılaştığınız sorun integer overflow'dur.

(signed) long Çoğu makinede -2147483647 ve 2147483647 değerleri bulunabilir. ya uint64_t türü (en az 64 bit üzerine) 018446744073709551615 için:

Sen, ben en makinelerde arasındaki değerler tutabilir, unsigned long long, öneriyorsun daha büyük veri türünü kullanmalıdır.

+1

'uint64_t' daha taşınabilir değil. İmzasız uzun "en az 64 bit olması garanti edilir. Tam olarak * 64 bite sahip bir türün var olduğuna dair bir garanti yoktur. Ve elbette, daha fazla bitin olması burada acı vermiyor. Uint64_t gibi türler, bit boyutunun önemli olduğu nadir uygulamalarla sınırlı olmalıdır. – celtschk

+1

Ayrıca, "uint64_fast_t" veya "uint64_least_t" kullanmayı da tercih edebilirsiniz, ancak çirkin ve neredeyse hiç kullanılmamışlardır. 64 bitden büyük bir tamsayı türünü destekleyen ancak tam olarak 64 bitlik bir tamsayı türünü desteklemeyen bir platform için oldukça nadirdir. Ayrıca, bazı kişilerin belirli tamsayı boyutlarını iyi bir uygulama olarak kullanmayı düşündüklerini unutmayın; bu şekilde kod farklı platformlarda farklı davranmayacaktır. Örneğin, Java ve .NET, altta yatan platformdan bağımsız olarak tamsayı türlerinin boyutlarını sabitledi ve bu büyük olasılıkla bir mantıksallıktır (yine de bu hazır için atıfta bulunmadığımı itiraf edeyim). –

1

Sen 'int' ve sadece çok büyük sayıları içerebilir 'uint64_t'

İlgili konular