-1

我正在尝试解决项目 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

4 回答 4

14

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

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

是相同的

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

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

(是的,正如其他人所建议的,如果您break;在需要时退出循环,则需要正确的结果,因为break;立即跳出循环,因此不会最后一次执行递增语句。)

于 2013-03-03T19:41:37.727 回答
7

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

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

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

而不是设置x为 1 来结束循环,您可以简单地break;退出循环而不运行更新代码。

于 2013-03-03T19:40:24.130 回答
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 loopONLY 的条件(即在num++执行语句之后),因此您的值num偏移了 1。

正如许多人建议的那样,您可以使用该break语句终止 for 循环执行,以便num当控件到达循环外部时,您希望它的值是您想要的值。

于 2013-03-03T19:44:56.307 回答
0

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

如果我是你,我会选择while带有条件的循环作为你的循环(我的意思是 for 循环中的长循环),它的主体是递增的。

于 2013-03-03T19:41:31.050 回答