我正在尝试解决项目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
)?
答案 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
循环(我的意思是循环中的长循环)和增量体。