2013-02-10 38 views
2

感謝您花時間閱讀這個問題!初學者C++:奇怪行爲

該程序是查找10億後的最小素數。在int main()的末尾,我包含一個控制檯輸入cin>>x;,意圖防止命令提示符過快關閉,以便我可以看到結果。然而,我意識到我必須先輸入一些東西,然後才能顯示出我想要的結果。

所以問題是:爲什麼這樣即使控制檯輸出語句cout<<i;在輸入語句cin>>x;之前?

#include <iostream> 
#include <math.h> 
using namespace std; 

int is_prime(int x); 

int main() 
{ 
    for (int i=100000000;;i++){ 
     if(is_prime(i)){ 
       cout<<i; 
       break;} 
    int x; 
    cin>>x; 

     } 

} 

int is_prime(int x) 
{ 
    double maxvalue = sqrt(static_cast<double>(x)); 
    for (int i=2;i<=maxvalue;i++){ 
     if (x%i == 0) return false; } 
     return true; 
} 

回答

3

爲什麼會這樣,即使控制檯輸出語句cout<<i;是輸入語句cin>>x;過嗎?

因爲break會更改執行順序,所以一旦找到質數,讓控件跳過cin >> x。您需要將cin >> x移出循環。

你可以做很多事情來優化一些事情:而不是試圖按每個數字1sqrt(N)進行劃分,你應該只劃分出目前爲止找到的素數。這會加速很多事情。您也可以使用i*i < x作爲您的退出條件來刪除sqrt的呼叫。

+0

D'oh,我弄錯了。我討厭代碼沒有格式化。 – 2013-02-10 14:58:31

+0

謝謝你,真是愚蠢的我!謝謝你的時間! – kuan 2013-02-10 15:02:44

3

看起來像cin >> x在for循環中。因此,循環的每次迭代都會嘗試從流中讀取某些內容。所以,你需要在我成爲素數之前輸入一些數字。

編輯:顯然,1000003是素數,所以你不必輸入很多數字。