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;
    }

另一个问题是您声明numberchar而不是int.

除此之外,您的程序正在运行(指向 ideone的链接),但不是最佳的。

为了使其达到最佳状态,请考虑以下更改(按照挑战增加的顺序):

  • 不要测试偶数是否为素数:在循环结束时打印另一条消息,说明i+1不是素数,并增加i2。
  • 当你达到候选的平方根时停止:换句话说,而不是n<=i-1for循环中写n*n <= i
  • 存储到目前为止找到的素数列表;而不是测试从2到的所有可能因素sqrt(i),只测试您已经找到的素数。
  • 考虑切换到更高级的算法来寻找素数
于 2013-01-30T19:19:04.103 回答
1

你的问题是:

  • number 应该是 int 或 unsigned int。
  • 第二个 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。

#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

我不确定你为什么在代码中循环两次你可以将它更改为类似

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 回答