2015-05-03 78 views
0

我想檢查一個數是否爲素數。這裏是我的代碼:爲特定輸入提供錯誤輸出的程序

#include <iostream> 

using namespace std; 

int main(){ 
    int num; 
    int i, k = 0; 
    cin >> num; 
    for(i = 2; i < num; i++){ 
     if(num % i == 0){ 
      k = k + 1; 
     } 
    } 
    if(k > 0){ 
     cout << "The number is not prime" << endl; 
    }else{ 
     cout << "Prime!" << endl; 
    } 
    return 0; 
} 

當我輸入6,78,...等它是給出正確的輸出。 但是當我輸入4294967296這不是質數時,它返回Prime!

回答

4

這是因爲4294967296是一個相當特殊的數字。它是2^32,這是int的存儲容量的限制,其通常僅保持32位。因此,您的num被解釋爲是0

其餘的從邏輯上跟隨溢出的誤解。從不輸入for循環,因爲2不小於0,所以k永遠不會遞增。

編輯實際上,在這種特殊情況下,由於其他原因失敗。 std::cin在輸入上執行截斷,所以當您輸入4294967296時,num實際上將被分配值2147483647。你的程序[正確]打印出該值是主要的。只是這不是用戶打算測試的數字。

+2

所以我需要使用更長的數據類型,比如'long long'? – Sakir

+0

@Sakir對於這個特定的情況,是的 - 你只需要一個更大的類型。也可能是'unsigned'。但是,無論如何,你的算法對於數字很慢。 int可存儲的最大正值是2147483647,在這種情況下,程序需要多長時間才能完成? – Barry

+0

我知道。我花了差不多22秒。我會用sieve算法:) – Sakir

1

您需要驗證您的輸入。 4294967296對於32位有符號整數太大,所以std::cin將其截斷爲2147483647,這實際上是質數。您可以檢查是否將您的號碼打印回屏幕。你也應該改變你的循環:

for(i = 2; i < num/2; i++) 

,因爲它會提供相同的結果,但減少計算時間兩次。

+0

你可以做*方式*比num/2更好。 – Barry

+0

@巴里是平方根,但這可能是足夠好比較OP有什麼 – Slava