首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试Prime程序

调试Prime程序
EN

Stack Overflow用户
提问于 2013-01-31 03:14:30
回答 4查看 180关注 0票数 0

我正在编写一个程序,用来判断一个数字是否为质数。编译时我没有得到任何错误,但是输出是不正确的。谁能告诉我哪里出了问题(以及如何修复?)

代码语言:javascript
复制
#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;
}
EN

回答 4

Stack Overflow用户

发布于 2013-01-31 03:19:04

最大的问题是你的程序总是在应该打印i的时候打印number

代码语言:javascript
复制
    if(prime){
       cout << i <<  PRIME << endl;
    }
    else{
       cout << i <<  NOT_PRIME << endl;
    }

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

除此之外,您的程序正在工作(link to ideone),但不是最优的。

要使其最优,请考虑以下更改(按挑战递增的顺序):

  • 不要测试偶数是否为素数:在循环的末尾打印另一条消息,说明i+1不是素数,并将i递增2。当达到候选值的平方根时,
  • 停止:换句话说,编写a more advanced algorithm for finding primes.

,而不是for循环中的素数列表;而不是测试从2到<2>d19的所有可能的因子,只测试您已经切换到代码的素数

票数 3
EN

Stack Overflow用户

发布于 2013-01-31 03:25:58

您的问题是:

  • 数字应为int或无符号int。
  • 第二个for循环没有任何意义。
  • 您的控制流太复杂,请使其更简单。

以下是我认为解决方案应该是什么样子:

代码语言:javascript
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2013-01-31 03:18:44

我不知道为什么要在代码中循环两次,您可以将其更改为如下所示

代码语言:javascript
复制
if (number % 2 == 0) prime = false;

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14611904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档