2015-05-06 147 views
2

我想編寫一個程序,輸入一些輸入數字,然後檢查它們是否爲素數。 我寫的是這樣的:檢查數字是否爲素數

#include <iostream> 

using namespace std; 

bool isPrime (int number) 
{ 
    for (int i=2; i<number; i++) 
    { 
     if(number % i == 0) 
      return false; 
     else 
      return true; 
    } 
} 

int main() 
{ 
    int y; 
    bool z; 

    cout << "Enter a positive integer: "; 
    cin >> y; 

    z = isPrime (y); 

    if(z==true) 
     cout <<"number is prime" << endl; 
    else 
     cout << "number is not prime" << endl; 

    system("PAUSE"); 

    return 0; 
} 

如,你可以看到,我想使用的功能和循環。 但是這段代碼只有一個數字。我想循環整個輸入過程。我怎麼做到的?

+1

請擺脫[system(「PAUSE」);](http://www.gidnetwork.com/b-61.html) - 您無法知道可能對其他人做了什麼人們的系統。也許在我的系統上暫停了我的核反應堆的冷卻。 –

+0

@DavidSchwartz我不認爲我想要你的工作:) –

+1

@MichaelDorgan我的工作是在klaxons發聲時儘快鍵入'PAUSE --restart'。 –

回答

0

只要把環圍繞整個main內容:

int main() 
{ 

    while (true) 
    { 
     int y; 
     bool z; 
     cout<<"Enter a positive integer: "; 
     cin>>y; 
     z= isPrime (y); 
     if(z==true) 
      cout <<"number is prime" << endl; 
     else 
      cout << "number is not prime" << endl; 
    } 

    system("PAUSE"); 
    return 0; 

} 
+0

太棒了!現在,我認爲我可以比以前更好地處理while循環。這對我來說很有用。謝謝:) –

+0

請記住,循環時這不是一個完美的設置。如果'cin'進入不良狀態,它會跳過要求用戶輸入並且無休止地循環。 – Carcigenicate

+0

那麼,請問您有更好的代碼建議嗎? –

3

想想這樣做:

for (int i=2; i<number; i++) 
{ 
    if(number % i == 0) 
     return false; 
    else 
     return true; 
} 

假設i是3或更大。然後在第一次迭代中,它檢查number是否可以被二整除。如果是,那麼它不是素數,所以返回false。但是,如果它不是可以整除的,那麼函數返回true(意思是number應該是素數) - 即使它不應該(例如,9,它不能被2整除,也不是素數)。

解決的辦法是返回true只有當你知道電話號碼不能分割任何東西(即for循環結束後):

for (int i=2; i<number; i++) 
{ 
    if(number % i == 0) 
     return false; 
} 
return true; 

對於輸入迴路,可以把程序的輸入/輸出部分在while循環:

while(true) { 
    cout << "Enter a positive integer: "; 
    cin >> y; 

    z = isPrime (y); 

    if(z==true) 
    cout <<"number is prime" << endl; 
    else 
    cout << "number is not prime" << endl; 
} 

然後,它將繼續讀了一些,檢查它是否是一個古板e並在循環中打印結果。您可以將檢查(例如,「如果數量小於0退出環路(即無效)」)

+0

對不起。也許,我不會很好,但這對我沒有用。該計劃仍然只有一個輸入,然後關閉。 –

+1

@MahmoudEidarous:確保'return 0;'在循環之外,否則會導致程序終止。 –

+0

@FabioTurati它在循環之外。 –

0

真簡單:只是包裝的一部分,你要在一個循環中重複:

INT主要(){

int y; 
bool z; 
while (true) { 
    cout<<"Enter a positive integer: "; 
    cin>>y; 
    z= isPrime (y); 
    if(z==true) 
     cout <<"number is prime" << endl; 
    else 
     cout << "number is not prime" << endl; 
    system("PAUSE"); 
    } 

}

這個程序永遠不會停止。在C++中,只要x爲真,while(x)就會重複運行一段代碼。在這種情況下,x只是true,所以它永遠運行代碼。

需要注意的一件事:我看到你在else陳述後縮進了三行,但你沒有使用花括號。在C++中,如果不使用花括號,則if,else,while,for等工作於只有一行。要使它們在多行上工作,請使用如下所示的大括號:

if(z==true) { 
    cout <<"number is prime" << endl; 
} 
else { 
    cout << "number is not prime" << endl; 
    system("PAUSE"); 
} 
0

有關簡單循環輸入的其他答案是正確的。我也強烈建議檢查一些衆所周知的檢查素數的算法。對於初學者來說,我會建議您檢查埃拉托色尼

的篩

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

否則,當有人選擇輸入一個很大數字,你會遇到性能問題。

0

擺脫您的功能中的else子句,並將return true;移至for循環的外部。目前,只要您的功能找到您的號碼可以被整除的一個號碼,它將返回true。所以如果你的數字是9,你的函數會很快發現它不能被2整除,並且返回true,儘管9不是素數。

移動return true;for循環之後有權通過所有的,而數字小於你輸入直到它發現了許多,你的號碼是整除的數使您的程序循環的作用,在這種情況下,你的函數將返回false或達到您的號碼,在這種情況下,執行離開for循環,並且函數返回true

bool isPrime(int number) 
{ 
    for (int i = 2; i < number; i++) 
    { 
     if (number % i == 0) 
      return false; 
    } 
    return true; 
} 
+1

關於9 ..它將如何返回true,雖然for循環會將9除以小於它的每個數。所以它會發現它不能被2整除,然後檢查3,發現它可以被3整除,然後返回false。 –

0

我發現這個article,它是更有效的 在確定一個數是否爲素數或不使用SQRT 代替循環從2到N-1。

int isPrime(int n) 
{ 
    int i; 

    if (n==2) 
     return 1; 

    if (n%2==0) 
     return 0; 

    for (i=3;i<=sqrt(n);i+=2) 
     if (n%i==0) 
      return 0; 

    return 1; 
}