调试Prime程序

时间:2013-01-30 19:14:30

标签: c++ primes

我在这个程序上工作,确定一个数字是否为素数。编译时我没有收到任何错误,但输出不正确。任何人都可以告诉我什么是错的(以及如何解决它?)?

#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 个答案:

答案 0 :(得分:3)

最大的问题是,如果您的计划应该打印number,则会始终打印i

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

另一个问题是您将number声明为char而不是int

除此之外,您的程序正在运行(link to ideone),但次优。

为了使其达到最佳,请考虑这些变化(按挑战增加的顺序):

  • 不要测试偶数作为素数:在循环结束时打印另一条消息,说明i+1不是素数,并将i增加2。
  • 当你达到候选人的平方根时停止:换句话说,而不是n<=i-1循环中的forn*n <= i
  • 存储您目前找到的素数列表;而不是测试从2sqrt(i)的所有可能因素,只测试您已找到的素数。
  • 考虑切换到a more advanced algorithm for finding primes

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

的东西
if (number % 2 == 0) prime = false;

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

意识到一个数字的最高除数(可以均匀分配)等于它的平方根,所以你不需要检查更多。

答案 3 :(得分: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;
}