【问题标题】:Why isn't my FizzBuzz code processing both if statements when they both match? [duplicate]为什么我的 FizBuzz 代码在两个 if 语句都匹配时不处理它们? [复制]
【发布时间】:2012-05-24 02:41:35
【问题描述】:

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

编写一个程序,打印从 1 到 100 的数字。但是对于 三的倍数打印“Fizz”而不是数字和 五的倍数打印“嗡嗡声”。对于数字的倍数 三个和五个都打印“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。我该如何避免这种情况?

【问题讨论】:

  • 因为它应该是else if 而不是你的第二个if 语句;)
  • @ThomasJungblut 不,因为那样 FizzBu​​zz 案子就一定行不通了。
  • @ThomasJungblut,不,他想把 Fizz 和 Buzz 连在一起,所以他故意省略了第一个 else if。
  • 是的,但他抱怨它会打印 fizzX,只是说'。

标签: java if-statement fizzbuzz


【解决方案1】:

你想要做的是

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

【讨论】:

  • 啊,但是里面有一个&amp;&amp;。 ;-)
  • 按照德摩根的规则改了……这是作弊吗? :-) 顺便说一句,这可能属于codegolf.stackexchange.com
  • 好吧,我只是在开玩笑。只有标题特别提到了 AND 运算符——我认为真正的目标是以某种方式只有两个 if 语句加上你的解决方案所包含的数字大小写。另外,请 +1。
  • @PlatinumAzure,就是这样,我还在想一个更好的标题,哈哈
  • 选择第二个选项。正是我想要的。
【解决方案2】:

你的第一个 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;
   }

【讨论】:

  • 我认为其目的是在编写 FizzBuzz 时重用 Fizz
  • @aioobe 是的,我认为这可以很容易地通过更多的条件嵌套来适应。我本来打算推荐一个开关盒,但Platinum Azure 已经为此提供了一个示例。
【解决方案3】:

如果您的唯一目标是避免使用&amp;&amp;,您可以使用双重否定和德摩根定律:

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 的事实来避免&amp;&amp;

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

【讨论】:

  • 只将 i%15 存储在顶部,而不是计算模数两次。
  • 一遍又一遍地声明最终变量是否会降低性能?我似乎记得多年前遇到过这种情况,但现在我找不到任何参考。
  • 我不知道有这样的事情。我认为编译需要更长的时间才能确保不会在同一范围内重新分配值,但我认为编译器还可以基于变量final 执行一些优化。我通常尽可能使用final
【解决方案4】:

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

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

问候。

【讨论】:

    【解决方案5】:

    只需添加一个标志变量并使用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);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案6】:

      这个没有去掉if语句但是没有使用&&(and)操作符,你可以翻转二元操作符。

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

      【讨论】:

        【解决方案7】:

        根本不要使用 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 上查看。

        【讨论】:

        • 无效因为 (i % 3 == 0) ? 1 : 0 实际上是一个 if 语句
        【解决方案8】:
        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);
                }
            }
        
        }
        

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • 这完全是错误的问题语言。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-20
          • 2021-04-02
          • 1970-01-01
          • 1970-01-01
          • 2018-03-01
          • 2015-01-08
          相关资源
          最近更新 更多