0

当使用“while”循环在 C# 中解决“fizz-buzz”时,我发现首先我应该找到 3 和 5 的倍数(15 的倍数),然后像下面那样找到 3 和 5 的倍数。

int myval = 0;

while (myval < 100)
{
    myval = myval + 1;

    if (myval % 15 == 0)
    {
        listBox1.Items.Add("fizzbuzz");
    }
    else if (myval % 3 == 0)
    {
        listBox1.Items.Add("fizz");
    }
    else if (myval % 5 == 0)
    {
        listBox1.Items.Add("buzz");
    }
    else
    {
        listBox1.Items.Add(myval);
    }
}

但是,如果我编写代码首先过滤 3 和 5 的倍数,然后像下面一样转到 3 和 5 的倍数(15 的倍数),最终结果只会显示嘶嘶声(3 的倍数)和嗡嗡声(5 的倍数) ) 没有嘶嘶声(3 和 5 的倍数)。有谁知道这是什么原因,即使 IDE 也没有显示任何错误。

myval = 0;

while (myval < 100)
{
    myval = myval + 1;

    if (myval % 3 == 0)
    {
        listBox1.Items.Add("fizz");
    }
    else if (myval % 5 == 0)
    {
        listBox1.Items.Add("buzz");
    }
    else if (myval % 15 == 0)
    {
        listBox1.Items.Add("fizzbuzz"); // for multiples of both 3 and 5  
    }
    else
    {
        listBox1.Items.Add(myval);
    }
}

最终结果没有 3 和 5 的嘶嘶声倍数

4

5 回答 5

6

因为它满足前两个条件。所以它永远不会影响你的第三个 else 语句。

于 2013-05-17T14:35:17.060 回答
4

这归结为if-else语句是按顺序处理的事实。一旦true遇到计算结果为的条件,就会跳过其他else if子句。

假设ab都是true。当你写

if (a) {
    Foo1();
}
else if (b) {
    Foo2();
}

你不要同时执行Foo1and Foo2。由于ais trueFoo1执行并且b甚至不被评估。

现在考虑你的问题。考虑数字 15。所有三个候选除数 3、5 和 15 都除以该数字。

if (myval % 3 == 0)
{
    listBox1.Items.Add("fizz");
}
else if (myval % 5 == 0)
{
    listBox1.Items.Add("buzz");
}
else if (myval % 15 == 0)
{
    listBox1.Items.Add("fizzbuzz"); // for multiples of both 3 and 5  
}
else
{
    listBox1.Items.Add(myval);
}

由于 的 的倍数15也是3( 和5) 的倍数,因此您甚至永远无法达到.myval % 15 == 0的倍数的测试15

于 2013-05-17T14:34:26.917 回答
2

这是因为能被 3 和 5 整除的东西也能被 3 和 5 整除。如果你先抓住其中任何一个条件,则永远不会检查后面的条件。

你也可以这样写:

var resultString = "";
if(myval % 3 == 0) resultString += "fizz";
if(myval % 5 == 0) resultString += "buzz";
if(myval % 5 != 0 && myval % 3 != 0) resultString += myval;
listBox1.Items.Add(resultString);

这将打印所有条件,而无需单独检查 % 15。

另外,我知道这不是最初的问题,但通常有人不会使用while循环来循环遍历一系列数字。为此使用for循环:

for( int myval = 0; myval <= 100; myval++)
{
    // code goes here
}
于 2013-05-17T14:35:38.610 回答
1

我总是以稍微不同的方式解决这个问题:通过构造要添加的字符串。

for (int myVal = 0; myVal < 100; myVal++)
{
    string fb = "";

    if ((myVal % 3) == 0) { fb = "fizz"; }
    if ((myVal % 5) == 0) { fb += "buzz"; }

    // Handle the case where it isn't divisible by 3 or 5:
    if (fb == "") { fb = myVal.ToString(); }

    // "output" the string.
    listBox1.Items.Add(fb);
}
于 2013-05-17T14:36:49.680 回答
0

您可以使用此方法填写您的Listbox

    foreach (int i in Enumerable.Range(1,100)){
        string str = null;
        listBox1.Items.Add((str = (i % 3 == 0 ? "fizz" : "") 
                                + (i % 5 == 0 ? "buzz" : "")) == "" 
                               ? i.ToString() : str );
    }
于 2013-05-17T14:49:46.997 回答