理解C#中的fizz嗡嗡声

时间:2013-05-17 14:32:26

标签: c# .net modulo fizzbuzz

当使用“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的倍数),如下所示,最终结果只显示fizz(3的倍数)和buzz( 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);
    }
}

end result without fizz-buzz multiples of both 3 and 5

5 个答案:

答案 0 :(得分:6)

因为它满足前两个条件。所以它永远不会打到你的第三个声明。

答案 1 :(得分:4)

这归结为if-else语句按顺序处理的事实。只要遇到评估为true的条件,就会跳过其他else if子句。

假设ab都是true。当你写

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

您不同时执行Foo1Foo2。由于atrueFoo1执行,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测试

答案 2 :(得分: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
}

答案 3 :(得分: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);
}

答案 4 :(得分: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 );
    }