2015-05-08 16 views
6

我的代碼如下。它的工作完美,而間隔不是很大。然而,無論什麼時候我超過一百萬的程序停止。例如對於時間間隔2到2000000,素數總和應該是142913828922(從本書的後面),而我的應用程序顯示1179908154.有人可以指出我出錯的地方。找到間隔之間的素數總和(C++程序不適用於大數字)

#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'和'long'只能包含這麼大的數字。 –

+5

「長」可以保持的最大值是2147483647.顯然,您的期望結果比這更大。您必須使用適當的數據類型。 –

+0

可能溢出 –

回答

4

您正在處理的問題是integer overflow

(signed) long可以在大多數機器上的值在-21474836472147483647之間。

你應該使用較大的數據類型,我會建議unsigned long long,這在大多數機器上,可容納之間的值(至少64位)或uint64_t018446744073709551615

+1

'uint64_t'不是更便攜。 'unsigned long long'保證至少有64位。不能保證存在具有*精確* 64位的類型。當然,更多的點數不會在這裏受到傷害。像'uint64_t'這樣的類型應該被限制在確切的位大小很重要的罕見應用中。 – celtschk

+1

您也可以選擇使用'uint64_fast_t'或'uint64_least_t',但它們很醜,很少使用。平臺支持大於64位的整數類型但不支持正好爲64位的整數類型是非常罕見的。另外請記住,有些人認爲使用特定的整數大小是一種好的做法 - 這樣代碼在不同平臺上的行爲將不同。例如,Java和.NET固定整數類型的大小,不管底層平臺如何,這可能是其中的一個基本原理(儘管我承認我沒有爲此準備好引用)。 –

1

你應該用'uint64_t'代替'int'和'long'的所有匹配項'