2014-09-28 54 views
0

爲什麼我的程序找到質數的工作,但退出在20,031的總理,這是225,149?沒有錯誤消息,並且x代碼聲稱程序「以退出代碼結束」,正如它通常那樣。素數計劃停止在20,031'素數,225,149沒有明顯的原因。沒有錯誤信息

我的問題不是關於程序本身,它似乎工作(尋找素數),但什麼限制或計算錯誤,我正在反對這導致它退出。

此循環有意無限,但它按照預期輸出到225,149,然後停止並退出且沒有錯誤。它只是退出,好像它到達了循環的結尾。我已經嘗試對迭代進行限制,並將其一點一點地提高到10,000,000,000,但奇怪地停止了相同的數字,225,149。

是否有超過或其他的計算時間限制?

輸出的最後一位:程序輸出從零開始的素數計數,然後輸出素數。

20027)225109 20028)225119 20029)225133 20030)225143 20031)225149 程序退出代碼爲結束:0

#include <iostream> 
#include <cmath> 
using namespace std; 

//performs modulus and find remainder return remainder r to void primal 
double fmodulus (double n, double d) 
{ 
    double r; 
    r= fmod(n, d); 
    return r; 
} 
//finds prime number using modulus double type modulus function fmod() 
void primal() 
{ 
    int count=1; 
    double n=3.0, d=2.0; 
    for (int i= 0; i>=0; ++i) 
    { 
     double r; 
     r= fmodulus(n, d); 

     //if n==d then is prime nymber 
     if (n==d) 
     { 
      cout<<count<<") "<<n<<endl; 
      n++; 
      d=2.0; 
      count++; 
     } 

     //if remainder == 0 then not prime number  
     else if (r==0) 
     { 
      n++; 
      d=2.0; 
     } 

     //not prime so updates d of modulus increment by 1 
     else 
     { 
      d++; 
     } 
    } 
} 


int main(int argc, const char * argv[]) 
{ 
    cout<<endl; 
    primal(); 
} 
+0

有更有效的算法來生成素數。 (我們知道3之後的所有素數都是6n-1或6n + 1的形式,n = 1,2,3 ...所以我們只需要檢查該形式的除數,只有除數達到平方根)但是如果不改變你使用的算法,你可以通過用'n = n + 2'代替'n ++'來改善它......沒有必要檢查是否有偶數是質數,你只需要檢查奇數。 – spencer7593 2014-09-28 07:00:34

回答

2

每次測試時i都會增加的問題。在這種情況下,您可以輕鬆達到20億次測試。當i溢出時,其值變爲負值,因此循環結束。

你可以做3件不同的事情來解決這個問題:

  • 首先是改變i類型,使其unsigned intunsigned long long。這些類型總是正面的,你的循環永遠不會結束。區別僅在於unsigned long long寫在64位而不是32位。

  • 第二種方法是更改​​循環中的條件;如果你想要它是無限的,你可以簡單地使用1。這是一般的真實情況。

  • 最後一種方法是更改​​程序,在第一個循環中插入第二個循環,以確保在每次迭代時都測試了不同的數字。

+2

+1。幾種實現無限循環的方法,例如'while(1)'或'for(;;)',但當下一個候選值(n)超過數據類型「int」或「long」的最大值時,素數檢查將會結束,所以我們真的不需要無限循環,只是循環直到n將超過數據類型的最大值。 – spencer7593 2014-09-28 07:03:04

2

最終,INT i會溢出。有符號的整數溢出是未定義的行爲,所以編譯器可以做任何想做的事情。

通常它只會溢出到INT_MIN,這是負值,所以循環結束。

嘗試使i成爲long並打印其值以進行監視。

+2

無論如何,「i」變量有什麼意義?它根本不用在循環中。 – 2014-09-28 06:23:14