for循环中的顺序是什么?

时间:2013-03-03 19:37:49

标签: c math loops for-loop

我正在尝试解决项目euler的问题5,我得到的答案是错误的:

#include <stdio.h>

main() 
{
    int num;
    int x = 0;
    for (num = 20; x == 0; num++)
    {
        if ((num%1) == 0 && (num%2) == 0 && (num%3) == 0 && (num%4) == 0 && (num%5) == 0 && (num%6) == 0 && (num%7) == 0 && (num%8) == 0 && (num%9) == 0 && (num%10) == 0 && (num%11) == 0 && (num%12) == 0 && (num%13) == 0 && (num%14) == 0 && (num%15) == 0 && (num%16) == 0 && (num%17) == 0 && (num%18) == 0 && (num%19) == 0 && (num%20) == 0)
        x = 1;
    }
    printf("%d %d", num, x);
}

我的程序不断打印232792561(我知道我正在打印x,这只是为了排除故障)。

我得到的逐字输出是:232792561 1

我做了一些研究,我发现问题的正确答案是232792560。 我现在开始相信问题在于for循环。

循环首先做什么,迭代(num++)或测试(x == 0)?

4 个答案:

答案 0 :(得分:13)

for循环可以转换为等效的while循环:

for (num = 20; x == 0; num++) {
    // do stuff
}

相同
num = 20;
while (x == 0) {
    // do stuff, then
    num++;
}

首先检查条件,然后执行循环体,然后执行增量。

(是的,正如其他人所建议的那样,如果你需要时break;离开循环,你需要正确的结果,因为break;会立即跳出循环,从而增加语句最后一次没有执行。)

答案 1 :(得分:6)

执行循环体之后(如果有的话,因为首先运行初始化代码,然后检查条件以查看是否输入了正文),

  • 首先运行更新代码
  • 然后检查条件。

因此,在将x设置为1后,num会再次递增。

不是将x设置为1来结束循环,而是简单地break;,这将在不运行更新代码的情况下退出循环。

答案 2 :(得分:1)

你的循环是不必要的复杂,如果你愿意,可以使用while循环结构简化。您还可以摆脱不必要的变量x

int main() {
    int num = 20;
    while (!((num%1) == 0 && (num%2) == 0 && (num%3) == 0 && (num%4) == 0 && (num%5) == 0 && (num%6) == 0 && (num%7) == 0 && (num%8) == 0 && (num%9) == 0 && (num%10) == 0 && (num%11) == 0 && (num%12) == 0 && (num%13) == 0 && (num%14) == 0 && (num%15) == 0 && (num%16) == 0 && (num%17) == 0 && (num%18) == 0 && (num%19) == 0 && (num%20) == 0))
    {
        ++num;
    }
    printf("%d\n", num);
    return 0;
}

回答你的for循环给出错误答案的原因:

虽然您为x = 1的正确值设置了num,但您只是在循环的下一次迭代中检查for loop的条件(即{{1}之后语句被执行),因此你的num++的值被偏移了1。

正如许多人建议的那样,你可以使用num语句来终止for循环执行,这样当控件到达循环外时,break的值就是你想要的值。 / p>

答案 3 :(得分:0)

第1步:初始化(num = 20
第2步:测试
第3步:迭代
第4步:测试
第5步:迭代
等等。

如果我是你,我会选择带有条件的while循环(我的意思是循环中的长循环)和增量体。