对于那些不知道的人,FizzBuzz存在以下问题:
编写一个程序,打印从1到100的数字。但是 三倍的多个打印“Fizz”而不是数字和为 五倍的打印“Buzz”。对于倍数为的数字 三个和五个打印“FizzBuzz”。
我找到的每个FizzBuzz解决方案都是为了原创而制作的一些疯狂的深奥解决方案,或者是你的基本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);
}
}
我正在寻找一个简单的解决方案,旨在取出“FizzBuzz”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来打印FizzBuzz,但是如果数字是3,它会打印Fizz3。我该如何避免这种情况?
答案 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 == 0
和i % 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)