3

这里的目标是创建一个程序,它可以找到并输出 1 到 100 之间的所有质数。我注意到我倾向于使事情复杂化并创建低效的代码,而且我很确定我在这里也这样做了。最初的代码是我的,我放在评论标签之间的所有东西都是书中给出的代码作为解决方案。

// Find all prime numbers between 1 and 100

#include <iostream>
#include <cmath>
using namespace std;

    int main()
    {
        int counter; // loop counter
        int count_two; // counter for second loop
        int val; // equals the number of count, used in division to check for primes
        bool check;

        check = true;

        for(counter = 1; counter <= 100; counter++){
            val = counter;
                for(count_two = 2; count_two <= 9; count_two++){
                    if((val % count_two) == !(check)){
                        cout << val << " is a prime number.\n";
                }
          }
    }
    return 0;
}
// program didn't work properly because of needless complication; all that needs to be checked for is whether a number is divisible by two

/*
*********correct code***********
#include <iostream>
using namespace std;
int main()
{
    int i, j;
    bool isprime;
    for(i=1; i < 100; i++) {
        isprime = true;
    // see if the number is evenly divisible
    for(j=2; j <= i/2; j++)
    // if it is, then it is not prime
        if((i%j) == 0) isprime = false;
        if(isprime) cout << i << " is prime.\n";
}
return 0;
}
********************************
*/

据我所知,我在这里走的是一条相当正确的道路。我想我用双循环和过度使用变量使事情变得复杂,这可能导致程序工作不正确——如果需要,我可以发布输出,但这肯定是错误的。

我的问题基本上是这样的:我到底哪里出错了?我不需要有人重做这个,因为我想自己更正代码,但我已经看了一段时间,不太明白为什么我的代码不起作用。此外,由于我对此很陌生,因此任何有关语法/可读性的输入也会有所帮助。提前致谢。

4

2 回答 2

5

实际上,您的代码说,如果一个数字可以被 2 到 9 之间的任何数字整除,那么它就是素数。您需要一个变量来要求它是all而不是any,并且您还需要更改它线:bool

if((val % count_two) == !(check)){

由于check= true,解决如下:

if ((val % count_two) == !true){

if ((val % count_two) == false){

if ((val % count_two) == 0){

(注意该值false是如何转换为 的0。某些语言会在此处给出编译错误。C++ 将其转换为整数)。

这实际上与您想要的相反。相反,写这个,这是正确和清晰的:

if (val % count_two != 0) {

最后,为了可读性(和方便!),您可以做的一件事是写i, j, 和k而不是counter,count_twocount_three. 这三个字母被程序员普遍认为是循环计数器。

于 2013-05-06T02:13:32.033 回答
2

除了以上几点:

  1. 你似乎认为你不需要有 2 个循环。你确实需要他们两个。
  2. 目前,在您的代码中,内循环的上限独立于外循环的值。但这是不正确的;您需要测试 sqrt(outer_loop_value) 的可分性。您会在您的“正确”代码中注意到它们使用了一半的 outer_loop_value - 这可能是一种性能折衷,但严格来说您需要测试 sqrt()。但是考虑到您的外循环最多为 7,您的内循环正在测试除法一直到 9,而 7 在该范围内。这意味着 7 将被报告为非素数。
  3. 在您的“正确”代码中,缩进使代码更难解释。内部 for 循环只有一条指令。该循环遍历所有可能的除数。这是不必要的,它可能会在 mod 为零的第一点爆发。但关键if(isprime) cout << i << " is prime.\n";是发生在外循环,而不是内循环。在您的(未注释的)代码中,您已将其放在内部循环中,这会导致每个外部循环值有多个响应。
  4. 从风格上讲,不需要将计数器复制到新的 val 变量中。
于 2013-05-06T02:42:16.037 回答