2016-08-05 8 views
-1

私はこのプログラムを数時間作成しようとしていますが、私は完全に困惑しています。私はコードブロックでGNU GCCコンパイラを使用しています。修正がない0から、1からあなたのループを開始することです:数字がプライムであるかどうかを定義する関数は、C++プログラムがクラッシュする原因となります。

また
... 
for (int i = 1; i <= number; i++) { 
... 

、あなたDR;それはおそらく愚かなものだが、私はプログラミング

+7

モジュロ演算子 '%'は*除算*を実行していますが、0での除算は...? –

+0

すばやくお返事いただきありがとうございます。コードのバージョンをすばやく編集し、動作するかどうかを確認します –

+0

ご協力ありがとうございました –

答えて

2

TLにのみ新しいです

#include <iostream> 

using namespace std; 

bool Is_Prime(int number); 

int main() { 
    if (Is_Prime(3)) { 
     cout << "Prime" << endl; 
    } 
    system("pause"); 
} 
bool Is_Prime(int number) { 
    int x = 0; 
    for (int i = 0; i <= number; i++) { 
     if ((number % i) == 0) { 
      x = x + 1; 
     } 
     if (x > 2) { 
      return false; 
     } 
    } 
    return true; 
} 

1からnumberまでのすべての番号をチェックして、numberがプライムであることを確認する必要はありません。最初の除数が見つかるとすぐに、numberは素数ではないことが分かります。 1からsqrt(number)までの約数が見つからない場合は、numberが素数であることを確認できます。また、特別なケースの1もあります。

だから、私はあなたのコードビットを強化しましょう:

UP
bool Is_Prime(int number) 
{ 
    for (int i = 2; i * i <= number; ++i) 
    { 
    if (number % i == 0) 
    { 
     return false; 
    } 
    } 
    return number > 1; 
} 

:あなたはあなたのプログラムがstd::numeric_limits<int>::max()に近い数字のために実行することができることを期待する場合も、その行i * iがオーバーフローする可能性があります。この場合、あなたは読みにくく、しかし安全な代替使用することができます:

i <= number/i 
+1

(このコメントは間違っています) 'number%1'は常にゼロになるので、プログラムが正しくなりません。 – MikeCAT

+0

ああ、私はプログラムの意味を理解していて、私の前のコメントは間違っています。 – MikeCAT

+0

'i * i <= number'だけにプラス1つ。 – Bathsheba

0

あなたは%演算子(N3337 5.6乗法演算子、段落4)の第二のオペランドとして0を使用して未定義の動作を呼び出し、それが作られたと思われますプログラムがクラッシュします。

もう1つの注意点は、1以下の整数は素数ではないため、ループの前に拒否する必要があることです。

関連する問題