学习C ++,从书中寻找对该项目的澄清

时间:2013-05-06 02:11:34

标签: c++ loops

这里的目标是创建一个程序,找到并输出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;
}
********************************
*/

从我可以收集的信息来看,我在这里是一条相当正确的道路。我认为我使用双循环和过度使用变量来复杂化,这可能导致程序工作不正确 - 如果需要,我可以发布输出,但这肯定是错误的。

我的问题基本上是这样的:我到底出错了什么地方?我不需要有人来重做这个,因为我想自己更正代码,但我已经看了一段时间,并且无法弄清楚为什么我的工作不起作用。此外,由于我对此不熟悉,因此任何有关语法/可读性的输入都会有所帮助。提前谢谢。

2 个答案:

答案 0 :(得分:5)

实际上,如果可分割 任何数字从2到9,你的代码会说一个数字是素数。你需要一个{{1变量某处要求它是所有而不是任何,你还需要改变这一行:

bool

if((val % count_two) == !(check)){ = check以来,解析如下:

true

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

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

(注意值if ((val % count_two) == 0){ 如何转换为false。有些语言会在这里产生编译错误.C ++将其转换为整数。)

事实上,这与你想要的完全相反。相反,写下这个,这是正确和清晰的:

0

最后,为了便于阅读(和方便!),你可以做的一件事就是写if (val % count_two != 0) { ij而不是k,{{1} }和counter。这三个字母被程序员普遍认为是循环计数器。

答案 1 :(得分: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变量中。