2012-10-12 46 views
1

我在這裏有代碼來列出3-100中的所有素數。我的主要問題是該程序只打印三個。我認爲出於某種原因,它離開了循環或其他東西。我在for語句中放了一個break,一旦發現該數字不是素數就可以將其打印出來,從而立即離開for循環。但是,它似乎沒有工作。在C++中打印3-100之間的所有素數

#include <iostream> 
#include <conio.h> 
#include <cmath> 

using namespace std; 

int main() 
{ 
    bool prime = true; 

    for (int x = 3; x <= 100; x++) 
    { 
     for (int y = 2; y <= (x - 1); y++) 
     { 
      if ((x % y) == 0) 
       prime = false; 
      break; 
     } 

     if (prime == true) 
      cout<<x<<endl; 
    } 

    getche(); 
    return 0; 
} 
+0

你不需要{}後,如果((X%Y)== 0) {prime = false;打破; }?你也需要在第一次循環開始時設置prime = true。 – esertbas

+2

附註:風格:你可能想縮進嵌套的for循環,可能更容易閱讀自己的代碼,而恰好趕上這種編程錯誤。 – WeirdlyCheezy

+1

只要採取和打印:http://primes.utm.edu/lists/small/10000.txt'的printf(「2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 \ n「);'(JK) – PiotrNycz

回答

2

當您將素數設置爲false以表示單個數字不是素數時,您再也不會將素數設置爲真。

2

在第一個for循環中的第一行,把這個:

prime = true;

目前,你永遠不會重置prime旗回true,所以當你到4,並設置primefalse ,它從未「發現」過一個素數,因爲prime總是錯誤。

全碼:

#include <iostream> 
#include <conio.h> 
#include <cmath> 

using namespace std; 

int main() 
{ 
    bool prime = true; 

    for (int x = 3; x <= 100; x++) 
    { 
     prime = true; 
     for (int y = 2; y <= (x - 1); y++) 
     { 
      if ((x % y) == 0) 
      { 
       prime = false; 
       break; 
      } 
     } 

     if (prime == true) 
      cout<<x<<endl; 
    } 

    getche(); 
    return 0; 
} 
+0

哎呀,不知道我的回答是值得downvote的。我很想獲得一些有關我可以改進的反饋。 – Gromer

+0

酷,加上他失蹤的括號。 – Gromer

+0

這是一個經典。 (x%y)測試中沒有{}。標記一下,其中一些人有些苛刻。 –

1

後的第一個循環初始化素= TRUE;。因爲一旦素數是錯誤的,它不會再變成真實的。

for (int x = 3; x <= 100; x++) 
{ 
    prime=true; 
    ///rest of the code 

} 
1

你永遠不會重置素數爲真。在你cout之後,你需要做 prime = true;

0

試試這個。

for (int x = 3; x <= 100; x++) 
{ 
    for (int y = 2; y <= (x - 1); y++) 
    { 
     if ((x % y) == 0) 
     break; 
     if((x-1)==y) 
     cout<<x<<endl; 
    }  
} 
6

的問題是:

for (int y = 2; y <= (x - 1); y++) 
{ 
    if ((x % y) == 0) 
     prime = false; 
     break; 
} 

當它應該是

for (int y = 2; y <= (x - 1); y++) 
{ 
    if ((x % y) == 0) 
    { 
     prime = false; 
     break; 
    } 
} 

你打破每一次與prime設置爲true,除非滿足第一個條件。

您還可以重置prime真在每次迭代:

for (int x = 3; x <= 100; x++) 
{ 
    prime = true; 
0

內環總是會調用break語句,因爲,因爲它不是裹在括號中如果只執行了第一道防線。另外你需要將布爾變量重新設置爲每個編號(即第一個循環內)

if ((x % y) == 0) 
{ 
    prime = false; 
    break; // previously it was always breaking 
} 

以前它基本上是這樣:

if ((x % y) == 0) 
{ 
    prime = false; 
} 
break; // WRONG! 
0
int main() 
{ 

    for (int x = 3; x <= 100; x++) 
    { 
    bool prime = true; 
    for (int y = 2; y <= (x - 1); y++) 
    { 
     if ((x % y) == 0) 
     { 
      prime = false; 
      break; 
     } 
    } 

    if (prime == true) 
    { 
     cout<<x<<endl; 
    } 
    } 

    getche(); 
    return 0; 
} 

你需要設置環路內黃金,並且你想把它設置爲false,並在你的內部循環中打破測試。

老手的提示號碼45623,即使你可以跳過大括號,如果代碼塊是一行,不要。

0

由於每個人說這一點,你有2個錯誤:

1)你永遠不會重置prime價值,所以加一個prime = true開始的外for
2)轉換到if ((x % y) == 0) prime = false; break;否則if ((x % y) == 0) {prime = false; break;}內用於將僅執行一次!!

0

這裏是在3〜100 使用一個計數器變量n不是一般的算法來查找的素數打印的素數的碼。

#include <iostream.h> 
#include <conio.h> 

int main() { 
    int i; 
    int j; 
    clrscr(); 
    int count=0; 
    for(j=100; j>=3; j--) { 
     for(int i=1; i<=j; i++) { 
      if(j%i==0) 
       count++; 
     } 
     if(count==2) 
      cout<<"\n"<<j; 
     count=0; 
    } 
    getch(); 
}     
+0

噢,夥計...你的代碼的格式是太可怕... – GingerPlusPlus

0

爲了提高效率試試這個 它的Java版本,但你可以嘗試同樣的邏輯下

boolean prime; 
    int iCount = 0; 
    int jCount = 0; 
    for(i = 2; i <= 100; i++) 
    { 
     iCount += 1; 

     prime = true; 
     int squared = (int) (Math.sqrt(i)); 

     for(j = 2; j < squared; j++){ 
      jCount += 1; 

     if(i%j == 0) prime = false; 
     } 
     if(prime) System.out.print(i+" "); 
    }