【问题标题】:understanding the fizz buzz in C# [closed]了解 C# 中的嘶嘶声 [关闭]
【发布时间】:2013-05-17 14:32:26
【问题描述】:

当使用“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);
    }
}

【问题讨论】:

  • 代码按预期运行。由于您使用的是 else if,因此您不允许多个逻辑决策。
  • 你能解释一下如何仅通过更改“if statements”来正确编写它
  • @scylla 我相信您能够自己阅读和理解下面的许多答案,不是吗?如果没有,我们还应该告诉你什么?
  • 我非常感谢所有帮助我的用户。我刚刚从您那里学到了几种完成相同任务的新方法。但作为一个编程初学者,我想如果我以自己的方式纠正我在这段代码中犯的错误,而不是完全编写新代码,会更好。

标签: c# .net modulo fizzbuzz


【解决方案1】:

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

【讨论】:

  • +1,OP 需要首先检查myval % 15,然后从那里向下移动
  • @JensKloster - 是的。经典面试题:)
  • 看起来这是最简单的方法。谢谢詹斯!
【解决方案2】:

这归结为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 的倍数。

【讨论】:

  • 但是有没有办法通过只改变“if-else 语句”而不改变倍数的顺序来纠正这个问题。
  • 如果你想用一个简单的if ... else if ... else if ... 来做,那么你需要注意顺序。你可以这样做,if (isFizz &amp;&amp; !isBuzz) 类型的方法,但这更复杂。这个问题本质上很复杂。
【解决方案3】:

这是因为可以被 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
}

【讨论】:

    【解决方案4】:

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

    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);
    }
    

    【讨论】:

    • 您似乎错过了数字不能被 3 或 5 整除的情况。
    • 我修复了代码。只需要先经过同行评审。
    • 看起来我建议的编辑被拒绝了...这是我更改的内容:if (fb != "") { listBox1.Items.Add(fb); } 更改为:if (fb == "") { fb = myVal.ToString(); } listBox1.Items.Add(fb);
    • 干得好@Nolonar。 :)
    【解决方案5】:

    您可以使用此方法填写您的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 );
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多