我制作了一段代码,将斐波那契序列低于4 000 000并总结偶数。为了做到这一点,我做了一个简单的代码,应该可以工作但是" C"变量超过4 000 000它不应该(它以数字结束:" 5 702 887"),你可以在这里看到:
int amount = 4000000;
int A = 1;
int B = 2;
int C = 0;
int answer = 0;
while (C < amount)
{
C = A + B;
if (C % 2 == 0)
{
answer = answer + C;
}
A = B;
B = C;
}
答案 0 :(得分:5)
在检查其值后,您正在修改C
。运营商按预期工作。
while
时正在评估您的C = 3524578
条件,然后您将其增加到&gt; 5,000,000号码,使用它,然后再次检查。
请记住,当条件为while
时,false
循环将始终退出。
您应该调整测试的顺序。例如,
int amount = 4000000;
int A = 1;
int B = 2;
int C = 3; // I've changed this to give an appropriate start value
int answer = 0;
while (C < amount)
{
if (C % 2 == 0)
{
answer = answer + C;
}
A = B;
B = C;
C = A + B; // I've moved this so that answer is not in between the altering of this value and the check for it.
}
您还可以实现for
循环,它将以更加语言本地的方式执行此操作。
int amount = 4000000;
int A = 1;
int B = 2;
int answer = 0;
for (int C = 3; C < amount; C = A + B)
{
if (C % 2 == 0)
{
answer = answer + C;
}
A = B;
B = C;
}
这里的不同之处在于每次设置C
时都会评估谓词表达式。
我处于类比的情绪中,我不认为我真的在这里解释了实际的错误,因为我只是提供了正确的代码来解决问题(教一个人钓鱼,因为他们()),所以这里是一个现实世界的逻辑缺陷的例子。
让我们说你正在吃橙片,你绝对讨厌种子,并且不想与任何含有它们的橙子有任何关系。通常情况下,你选择一个,检查它的种子,如果它清楚,吃它。如果你遇到一个带有种子的东西,那么粗略地扔掉你剩下的所有橙色切片。在伪代码中,while (the next one doesn't have any seeds) { eat it and grab another. }
。很简单,对吧?
然而,你在这里写while
循环的方式,你正在吃一片,在嘴里找到种子,然后将它们扔掉。正如您所看到的,这些是非常不同的情况。
后者因为你吃了(使用)它而不是之前检查了切片(变量)而容纳了遗憾。你知道不要再吃了,当然,你已经吃了种子。在你吃之前检查它会好得多,因为那时你已经知道它在它附近的任何地方被污染了。
答案 1 :(得分:4)
我怀疑你对初学者有一种常见的错误信念。 while
语句不会在违反条件的情况下立即终止循环。
考虑while
循环的正确方法是
while(condition)
statement
在逻辑上与以下内容相同:
continue_label:
if (!condition) goto break_label;
statement
goto continue_label;
break_label:
答案 2 :(得分:0)
while
循环的条件仅在每次进入循环时执行。如果您查看代码,则在此检查后分配C
。尝试在C
作业之前打印C = ...
- 您会发现它没有超出限制。
下一个赋值超出了值,但不再输入while循环。
答案 3 :(得分:0)
当检查C时,它仍然低于4000000,但随后在迭代内它升高到极限(C = A + B)并且在下一次迭代中它高于该值并且循环退出。而不是试试这个&#34;很脏&#34;实现:
int amount = 4000000;
int A = 1;
int B = 2;
int C = 0;
int answer = 0;
for (int i = 0; i < amount; i = A + B)
{
C = A + B;
if (C % 2 == 0)
{
answer = answer + C;
}
A = B;
B = C;
}