8

知らない人のために説明すると、FizzBu​​zz は次の問題です。

1 から 100 までの数字を出力するプログラムを作成します。ただし、3 の倍数の場合は数字の代わりに "Fizz" と出力し、5 の倍数の場合は "Buzz" と出力します。3 と 5 の両方の倍数の場合は、"FizzBu​​zz" と出力します。

私が見つけたすべての FizzBu​​zz ソリューションは、独創性を高めるために作成されたクレイジーで難解なソリューション、または基本的な if-else チェーンのいずれかです。

for(int i = 1; i <= 100; i++) {

if(i % 3 == 0 && i % 5 == 0) {
   System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
   System.out.println("Fizz");
} else if (i % 5 == 0) {
   System.out.println("Buzz");
} else {
   System.out.println(i);
}
}

「FizzBu​​zz」ifステートメントを取り除くことを目的とした簡単なソリューションを探しています。私はこれを念頭に置いています:

for(int i = 1; i <= 100; i++) {

if (i % 3 == 0) 
   System.out.print("Fizz");
if (i % 5 == 0) 
   System.out.println("Buzz")
else
   System.out.println(i);
}

しかし、これはうまくいきません。Fizz と Buzz の両方の if を入力して FizzBu​​zz を出力できると思いますが、たとえば数値が 3 の場合、Fizz3 が出力されます。どうすればこれを回避できますか?

4

9 に答える 9

10

あなたがやろうとしていることは

if (a)
    ...
if (b)
    ...
else // if neigther a nor b
    ...

これは単に不可能です。は単一のelseにのみ属することができifます。少し長いバリアントを使用する必要があります。

モジュロ演算子の冗長な評価を避けるために、ループ本体を次のように定式化できます。

boolean fizz = i % 3 == 0;
boolean buzz = i % 5 == 0;

if (fizz) 
   System.out.print("Fizz");
if (buzz)
   System.out.print("Buzz");
if (!(fizz || buzz))
   System.out.print(i);

System.out.println();

もう一つは

String result = "";

if (i % 3 == 0)   result = "Fizz";
if (i % 5 == 0)   result += "Buzz";
if (result == "") result += i;

System.out.println(result);
于 2012-05-16T14:04:54.237 に答える
3

の使用を避けることが唯一の目標である場合は&&、二重否定とド・モルガンの法則を使用できます。

for(int i = 1; i <= 100; i++) {

    if(!(i % 3 != 0 || i % 5 != 0)) {
       System.out.println("FizzBuzz");
    } else if (i % 3 == 0) {
       System.out.println("Fizz");
    } else if (i % 5 == 0) {
       System.out.println("Buzz");
    } else {
       System.out.println(i);
    }
}

RFC1337の回答に従って、とが意味する&&という事実の使用を避けることができます。i % 3 == 0i % 5 == 0i % 15 == 0

別の解決策はswitch、余りにaを使用することです(mod 15、つまり3の5倍):

for(int i = 1; i <= 100; i++) {
    final int mod = i % 15;
    switch (mod) {
        case 0:
        case 3:
        case 6:
        case 9:
        case 12:
            System.out.print("Fizz");
            if (mod != 0) break;
        case 5:
        case 10:
            System.out.print("Buzz");
            break;
        default:
            System.out.print(i);
    }

    System.out.println();
}
于 2012-05-16T14:03:03.587 に答える
0

フラグ変数を追加して使用するだけSystem.out.printです:

package com.stackoverflow;

public class FizzBuzz {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            boolean printed = false;
            if (i % 3 == 0) {
                printed = true;
                System.out.print("Fizz");
            }
            if (i % 5 == 0) {
                printed = true;
                System.out.print("Buzz");
            }

            if (printed) {
                System.out.println();
            } else {
                System.out.println(i);
            }
        }
    }
}
于 2014-08-15T19:54:40.033 に答える
0

これは if ステートメントを取り出しませんが、&& (and) 演算子を使用しません。2 項演算子を反転させることができます。

//FizzBuzz Case
if(!(a % 3 != 0 || a % 5 != 0)){ //flips 
  result[index] = "FizzBuzz";
  index++;
  }
于 2015-04-25T20:48:26.033 に答える