2017-01-09 19 views
-3

私はProject Eulerから取得したプライムテストアルゴリズムを持っていますが、43が入力として渡されたときfalseを返します。擬似コードは概要で与えられました。これをC++コードに変換しました。疑似コードの変換に間違いがあるかもしれません。アルゴリズムの実際の問題は何ですか?プライムテストアルゴリズムが正しく動作しない

#include <iostream> 
#include <cmath> 

using namespace std; 

bool is_prime(int n) 
{ 
    if(n <= 1) 
    { 
     return false; 
    } 
    else if(n < 4) 
    { 
     return true; 
    } 
    else if(n % 2 == 0) 
    { 
     return false; 
    } 
    else if(n < 9) 
    { 
     return true; 
    } 
    else if(n % 3 == 0) 
    { 
     return false; 
    } 
    else 
    { 
     int r = sqrt(n); 
     int f = 5; 
     while(f <= r) 
     { 
      if(n % f == 0) 
      { 
       return false; 
      } 
      if((n + 2) % f == 0) 
      { 
       return false; 
      } 
      f = f + 6; 
     } 
     return true; 
    } 
} 

int main() 
{ 
    cout << is_prime(43); 

    system("PAUSE"); 
    return 0; 
} 
+1

ブラケットの多くを、あなたがうまくいかないものを見ますたよりelse'sは、値43を使用してコードを読めない – Slava

+3

デバッグそれを作る 'redundand:あなたはすべてのそれらのif文を減らし、多少あなたのコードを簡素化することができます。落とし子が気に入らない場合は、printf-debuggingを使用してください。 – MrSmith42

+2

ループの2番目のテストは '(43 + 2)%5 == 0'です。これは明らかです。 – molbdnilo

答えて

0

アルゴリズムエラーが発生しました。代わりに (n+2)%f のそれはあなたのアルゴリズムが正しいですが、ここでのミス

 if((n + 2) % f == 0) //wrong 
     { 

      return false; 
     } 

に従っている n%(f+2)

+0

ありがとう、それは今すぐに動作します – Deo

2

をお読みください

 if(n%(f+2) == 0) //Right 
     { 

      return false; 
     } 
+0

ありがとう、それは今動作します – Deo

0

その他は、あなたの誤りを指摘しているべきです。

bool is_prime(int n) 
{ 
    if(n <= 1) 
    { 
    return false; 
    } 

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

    if(n % 3 == 0) 
    { 
    return n == 3; 
    } 

    // Check for factors of 5, 7, ... 
関連する問題