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

最初の 2 つの条件を満たしているからです。したがって、3 番目の else ステートメントにヒットすることはありません。

于 2013-05-17T14:35:17.060 に答える
4

if-elseこれは、ステートメントが順次処理されるという事実に要約されます。と評価される条件が検出されるとすぐにtrue、他のelse if句はスキップされます。

とが両方ともであるaとします。あなたが書くときbtrue

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

Foo1と の両方を実行しないでくださいFoo2aisであるためtrueFoo1実行され、b評価さえされません。

今あなたの問題を考えてみましょう。数 15 を考えてみましょう。3 つの候補約数、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 == 015

于 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 に答える