当使用“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);
}
}
答案 0 :(得分:6)
因为它满足前两个条件。所以它永远不会打到你的第三个声明。
答案 1 :(得分:4)
这归结为if-else
语句按顺序处理的事实。只要遇到评估为true
的条件,就会跳过其他else if
子句。
假设a
和b
都是true
。当你写
if (a) {
Foo1();
}
else if (b) {
Foo2();
}
您不同时执行Foo1
和Foo2
。由于a
为true
,Foo1
执行,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 );
}