# Fizz Buzz Bizz Fuzz in Java

Posted on

Problem

This questions is originally from http://contestcoding.wordpress.com/2013/06/28/fizz-buzz-bizz-fuzz/.

• Print the integers from 1 to 100,
• but for the multiples of 3, print “Fizz” instead and
• for multiples of 5, print “Buzz”.
• If the number contains a 3 (for example 23), print “Bizz” and
• if the number contains a 5, print “Fuzz”
• (if it contains multiple 3s or 5s, just print one “Bizz” or “Fuzz”).
• If the number contains more than one of these attributes, print every word (for example 33 prints “FizzBizz”, as 33 is both a multiple
of 3 and contains the digit 3).

My Java solution is:

``````public class FizzBuzz {
public static void main(String[] args) {
for (int i = 1; i < 101; i++) {
// Set this to true when one of the special conditions is met.
boolean printed = false;

if (i % 3 == 0) {
// When i is divisible by 3, then print "Fizz"
printed = true;
System.out.print("Fizz");
} else if (i % 5 == 0) {
// When i is not divisible by 3 but is divisible by 5, then print "Buzz"
printed = true;
System.out.print("Buzz");
}

if (Integer.valueOf(i).toString().indexOf("3") != -1) {
// When i has the digit 3 in it, then print "Bizz"
printed = true;
System.out.print("Bizz");
} else if (Integer.valueOf(i).toString().indexOf("5") != -1) {
// When i has the digit 5 in it, then print "Fuzz"
printed = true;
System.out.print("Fuzz");
}

if (printed == false) {
// The number does not satisfy any of the special conditions above.
System.out.print(i);
}
System.out.println();
}
}
}
``````

Solution

Overall, this is a pretty straightforward program. See the bottom of my answer for an Extreme Makeover: Code Edition of the program.

You have a hard-coded “magic number” in your `for` loop. It would be better to use a variable.

``````for (int i = 1; i < 101; i++) // not the best

int num = 101;
for (int i = 1; i < num; i++); // better
``````

Your `if` test conditions can be shortened a bit.

``````if (Integer.toString(i).indexOf("3") != -1)
``````

Your logic is a bit off. You should actually have fewer `else if` conditions (this is rarely the case, but here it is applicable). For example, when `i` reaches “15”, is should print “FizzBuzzFuzz”, but your program only prints “FizzFuzz”.

## Final code:

``````public class Test
{
public static void main(String... args)
{
int num = 101;
for (int i = 1; i < num; 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 (Integer.toString(i).indexOf("3") != -1)
{
printed = true;
System.out.print("Bizz");
}
if (Integer.toString(i).indexOf("5") != -1)
{
printed = true;
System.out.print("Fuzz");
}

if (printed == false) System.out.print(i);
System.out.println();
}
}
}
``````

## Extreme Makeover: Code Edition

Let’s use a `StringBuilder` and some ternary operators. And let’s get rid of that `boolean`.

``````public class Test
{
public static void main(String... args)
{
int num = 101;
for (int i = 1; i < num; i++)
{
StringBuilder sb = new StringBuilder();
if(i % 3 == 0) sb.append("Fizz");
if(i % 5 == 0) sb.append("Buzz");

if(Integer.toString(i).indexOf("3") != -1) sb.append("Bizz");
if(Integer.toString(i).indexOf("5") != -1) sb.append("Fuzz");

if (sb.length() == 0) System.out.print(i);
else System.out.print(sb);
System.out.println();
}
}
}
``````

1. Your implementation is broken, for example 15 should print `FizzBuzzFuzz` but yours will print `FizzFuzz`. 35 should print `BuzzBizzFuzz` but yours will print `BuzzBizz`.

2. Turning an integer into a string can be done with `Integer.toString(i)`.

3. For reusability your code should be encapsulated in a class which you can instantiate and play as many games as you like.

4. Once you have refactored the code into a class consider decoupling logic from output. For example you can pass in an `Appendable` to which you can append your output without having to care where it ends up.