0

数値が素数かどうかを判断するこのプログラムに取り組んでいます。コンパイル時にエラーは発生しませんが、出力が正しくありません。誰が何が間違っているのか教えてもらえますか (そしてそれを修正する方法は?)?

#define PROMPT "Please enter a whole number: "
#define NOT_PRIME "The number is not a prime number! "
#define PRIME "The number is a prime number "
#define DONE 0
#define FIRST_FACTOR 3

using std::cout;
using std::cin;

int main(){
   int i;
   char number;

   cout << PROMPT;
   cin >> number;

 for (i=FIRST_FACTOR; i<=number; i++){
        prime = true;
        for (int n=2; n<=i-1; n++){
           if (i%n == 0){
              prime = false;
           }
        }
        if(prime){
           cout << number <<  PRIME << endl;
        }
        else{
           cout << number <<  NOT_PRIME << endl;
        }
   }
   return 0;
}
4

4 に答える 4

3

number最大の問題は、プログラムが印刷すべきときに常に印刷することiです。

    if(prime){
       cout << i <<  PRIME << endl;
    }
    else{
       cout << i <<  NOT_PRIME << endl;
    }

もう 1 つの問題は、ではなくnumberとして宣言したことです。charint

それ以外は、プログラムは機能しています ( ideone へのリンク) が、最適ではありません。

最適化するには、次の変更を検討してください (課題の多い順に):

  • 偶数が素数かどうかをテストしないでください。ループの最後で、i+1素数ではないという別のメッセージを出力し、2 ずつインクリメントiします。
  • 候補の平方根に到達したら停止: つまり、代わりにn<=i-1ループfor書き込みn*n <= i
  • これまでに見つけた素数のリストを保存します。2からまでのすべての可能な要因をテストするのでsqrt(i)はなく、既に見つかった素数のみをテストします。
  • 素数を見つけるためのより高度なアルゴリズムへの切り替えを検討してください。
于 2013-01-30T19:19:04.103 に答える
1

あなたの問題は次のとおりです。

  • numberはintまたはunsignedintである必要があります。
  • 2番目のforループは意味がありません。
  • 制御フローは複雑で、単純になります。

これが私が解決策がどのように見えるべきだと思うかです:

#include <iostream>

int main() {
    std::cout << "Please enter a whole number: " << std::endl;
    unsigned int number;
    std::cin >> number;

    for (unsigned int i = 2; i * i < number; i++) {
        if(number%i == 0) {
            std::cout << "The number is not a prime number! " << std::endl;
            return 0;
        }

    }

    std::cout << "The number is a prime number " << std::endl;
    return 0;
}
于 2013-01-30T19:25:57.760 に答える
0

0 になるまで新しいエントリを要求し続けるために、2 回ループすることになっていると思います。

#define PROMPT "Please enter a whole number: "
#define NOT_PRIME " is not a prime number! "
#define PRIME " is a prime number "

using std::cout;
using std::cin;

int main(){

   int number;
   bool prime;

   while (true)
   {
      prime = false;

      cout << PROMPT;
      cin >> number;

      if (number == 0) break;

      int MaxPossibleFactor = (int)(sqrt(number) + 1);

      if ((number % 2) == 0)
      {
         prime = true;
      }
      else
      {
         for (int i=3; i<=MaxPossibleFactor; i += 2)
         {
            if ((number % i) == 0)
            {
               prime = true;
               break;
            }
         }
      }

      if (prime)
      {
         cout << number << PRIME << endl;
      }
      else
      {
         cout << number << NOT_PRIME << endl;
      }
   }


   return 0;
}
于 2013-01-30T20:24:20.843 に答える
0

コードで2回ループしている理由がわかりません。次のように変更できます

if (number % 2 == 0) prime = false;

for (i = 3; i <= sqrt(number) && prime; i+=2)
    if (number % i == 0) prime = false;

数値の最大の除数 (均等に割り切れる) は平方根に等しいので、それ以上チェックする必要はありません。

于 2013-01-30T19:18:44.323 に答える