“小于(<)”不能像它应该的那样工作

时间:2014-07-24 02:47:52

标签: c# windows

我制作了一段代码,将斐波那契序列低于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;
}

4 个答案:

答案 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;
}