8

对于那些不知道的人,FizzBu​​zz 是以下问题:

编写一个打印从 1 到 100 的数字的程序。但是对于三的倍数打印“Fizz”而不是数字,对于五的倍数打印“Buzz”。对于同时是三和五的倍数的数字,请打印“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,即 5 乘以 3):

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 回答
3

您的第一个 if 语句是单独的。

因此,您的代码会遇到第一个语句,它只是一个 if 语句,然后继续执行下一个语句,即 if/else 语句。

RosettaCode有一个很好的例子,没有使用 AND 运算符。

   int i;
   for (i = 0; i <= 100; i++) {
           if ((i % 15) == 0)
                   cout << "FizzBuzz" << endl;
           else if ((i % 3) == 0)
                   cout << "Fizz" << endl;
           else if ((i % 5) == 0)
                   cout << "Buzz" << endl;
           else
                   cout << i << endl;
   }
于 2012-05-16T14:10:03.927 回答
1

这是我的解决方案。当然,这有点复杂(如回旋处),但我相信它符合您的要求。

int main()
{
    char fizzpass=0;

    unsigned short index=0;

    for(index=1;index<=100;index++)
    {
        if(0 == (index%3))
        {
           printf("Fizz");
           fizzpass = 1;
        }

        if(0 == (index%5))
        {
           if(1 == fizzpass)
           {                  
              fizzpass = 0;
           }

           printf("Buzz\n"); 
           continue;
        }

        if(1 == fizzpass)
        {
            fizzpass = 0;
            printf("\n");
            continue;
        }

        printf("%d\n",index);
    }

    return 0;
}

问候。

于 2016-06-02T14:06:35.230 回答
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) 运算符,您可以翻转二元运算符。

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

根本不要使用 if 语句。

import java.util.*;
import java.lang.*;
import java.io.*;
class FizzBuzz
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String[] words = {"", "Fizz", "Buzz"};
        String[] nwords = {"", ""};

        for(int i = 1; i < 101; ++i)
        {
            int fp = (i % 3 == 0) ? 1 : 0;
            int bp = ((i % 5 == 0) ? 1 : 0) * 2;
            int np = ((fp > 0 || bp > 0) ? 1: 0);

            nwords[0] = Integer.toString(i);

            System.out.print(words[fp]);
            System.out.print(words[bp]);
            System.out.println(nwords[np]);
        }
    }
}

在ideone上看到它。

于 2016-02-08T05:00:42.520 回答
0
public class fizzbuzz 
{

    public static void main(String[] args) 
    {
        String result;
        for(int i=1; i<=100;i++)
        {    
            result=" ";
            if(i%3==0)
            {
                result=result+"Fizz";
            }
            if(i%5==0)
            {
                result=result+"Buzz";
            }
            if (result==" ")
            {
                result=result+i;
            }
            System.out.println(result);
        }
    }

}

这是我能想到的最有效的方法。希望能帮助到你!:)

于 2018-12-27T06:52:29.573 回答
-3

在 Python3 中完成的疯狂但不相关的解决方案

#!/usr/bin/python3

for i in range(1,100):
    msg = "Fizz" * bool(i%3==0)
    msg += "Buzz" * bool(i%5==0)
    if not msg:
        msg = i
print(msg)
于 2015-12-13T15:30:52.033 回答