没有AND运算符的FizzBu​​zz

时间:2012-05-16 13:59:26

标签: java if-statement fizzbuzz

对于那些不知道的人,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);
}

但这不起作用。我假设它可以通过输入ifs,Fizz和Buzz来打印FizzBu​​zz,但是如果数字是3,它会打印Fizz3。我该如何避免这种情况?

9 个答案:

答案 0 :(得分:11)

你要做的是

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

答案 1 :(得分:3)

如果您的唯一目标是避免使用&&,则可以使用双重否定和DeMorgan定律:

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's answer,您可以避免&&使用i % 3 == 0i % 5 == 0隐含i % 15 == 0这一事实。

另一个解决方案是在余数上使用switch(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();
}

答案 2 :(得分: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;
   }

答案 3 :(得分: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;
}

问候。

答案 4 :(得分: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);
            }
        }
    }
}

答案 5 :(得分:0)

这不会删除if语句但不会使用&amp;&amp; (和)运算符,你可以翻转二元运算符。

//FizzBuzz Case
if(!(a % 3 != 0 || a % 5 != 0)){ //flips 
  result[index] = "FizzBuzz";
  index++;
  }

答案 6 :(得分: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上查看。

答案 7 :(得分: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);
        }
    }

}

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

答案 8 :(得分:-2)

在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)