FizzBuzz Program in Java

2025年5月2日 | 阅读 9 分钟

FizzBuzz 是一个在孩子们中很受欢迎的游戏。通过玩这个游戏,孩子们学会了除法。现在,FizzBuzz 游戏已经成为一个程序员面试中经常被问到的流行编程问题。在本节中,我们将学习如何在 Java 中创建 **FizzBuzz 程序**。

FizzBuzz 游戏规则

FizzBuzz 游戏规则非常简单。

  • 如果数字能被 3 整除,则输出 Fizz
  • 如果数字能被 5 整除,则输出 Buzz
  • 如果数字能被 3 和 5 整除,则输出 FizzBuzz
  • 如果数字不能被 3 和 5 整除,则返回数字本身

注意:您可以使用不同的除数(如 5 和 7 等)和字符串(Fizz 和 Buzz)来代替 3 和 5。

让我们在 Java 程序中实现上述规则。

Java FizzBuzz 程序

有以下几种方法可以在 Java 中创建 FizzBuzz 程序:

  • 使用 else-if 语句
  • 使用 Java 8
  • 使用 mapToObj() 方法
  • 使用取模运算符
  • 不使用取模运算符

使用 else-if 语句

在下面的程序中,我们从用户那里读取一个整数 (n),它是打印 Fizz、Buzz 或 FizzBuzz 的上限。for 循环从 1 开始,直到条件 i<=n 为假。else-if 语句用于检查数字是否是 3 和 5 的倍数。

算法

步骤 1: 首先导入 Scanner 类,这是检索用户输入的重要工具。然后,实例化一个 Scanner 对象来方便读取输入。

步骤 2: 提示用户输入一个数字。使用 scanner 捕获用户提供的整数输入,并将其赋值给变量 "n"。

步骤 3: 通过控制台消息通知用户,程序将显示用户输入的数字까지的 Fizz、Buzz 和 FizzBuzz 数字。

步骤 4: 初始化一个从 1 到 "n"(包含)的循环。此循环将促进 Fizz、Buzz 和 FizzBuzz 数字的生成和显示。

  • 在此循环的每个数字 i
    • 检查数字 i 是否能同时被 3 和 5 整除
      • 如果为真,则打印 "FizzBuzz"。
    • 如果上述条件不满足,则检查 i 是否能被 3 整除
      • 如果为真,则打印 "Fizz"。
    • 如果以上任一条件都不满足,则检查 i 是否能被 5 整除
      • 如果为真,则打印 "Buzz"。
    • 如果所有条件都不满足(即数字不能被 3 或 5 整除),则打印数字 i 本身。
  • 在打印每个数字的相应输出后,打印一个逗号和一个空格来分隔条目。

步骤 6: 循环完成后(即处理完从 1 到 n 的所有数字)后,继续进行下一步。

FizzBuzzExample1.java

输出

FizzBuzz Program in Java

使用 Java 8

Java 8 提供了 IntStream 接口。我们使用了 IntStream 接口的以下两个方法。

rangeClosed() 方法: 它是 IntStream 接口的静态方法。它返回指定范围内的顺序 IntStream。

语法

该方法解析两个参数:

  • startInclusive: 这是初始值。
  • endInclusive: 包含的上限。

使用 mapToObj() 方法

该方法执行一个中间操作,并返回一个对象流,该流由将给定函数应用于此流的元素的结果组成。

语法

该方法解析一个参数 mapper(新流的元素类型)。它返回新流。

算法

步骤 1: 导入并创建一个 Scanner 实例来处理用户输入。

步骤 2: 显示提示信息,要求用户输入一个整数,读取用户的整数输入,并将其存储在变量 num 中。

步骤 3: 使用 IntStream.rangeClosed(1, num) 生成从 1 到 num 的整数流。

  • 使用 lambda 表达式转换流中的每个整数 i
    • 检查 i 是否能被 3 整除
      • 如果为真,还检查 i 是否能被 5 整除。如果两者都为真,则将 i 映射为 "FizzBuzz "。
      • 如果只能被 3 整除,则将 i 映射为 "Fizz "。
    • 如果不能被 3 整除,则检查 i 是否能被 5 整除
      • 如果为真,则将 i 映射为 "Buzz "。
      • 否则,将 i 转换为字符串,后跟一个空格。
    • 然后使用 forEach(System.out::print) 将生成的字符串流直接输出到控制台,它按顺序打印流中的每个元素。

步骤 4: 关闭 scanner 对象以防止资源泄露。在打印完流中的所有元素并关闭 scanner 后,程序将终止。

FizzBuzzExample2.java

输出

Enter the number: 40
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz

请注意,在上面的程序中,FizzBuzz 的逻辑通过使用 三元运算符 被调整为一行。这减少了代码行数。我们打印 Fizz 如果数字是 3 的倍数,打印 Buzz 如果数字是 5 的倍数,打印 FizzBuzz 如果数字是 3 和 5 的倍数,否则打印 数字 本身。

使用取模运算符

算法

步骤 1: 创建一个 Scanner 对象以从控制台读取用户输入。提示用户输入 FizzBuzz 游戏的上限。

步骤 2: 捕获用户输入的整数并将其存储在名为 limit 的变量中。此整数决定 FizzBuzz 序列的运行范围。

步骤 3: 使用 For 循环迭代从 1 到 limit 中存储的值。对于每个数字,使用条件检查来确定它与 3 和 5 的关系。

步骤 4: 在循环内,检查每个数字是否可以被 3、5 或两者整除。

  • 如果数字能同时被 3 和 5 整除,则打印 "FizzBuzz"。
  • 如果数字只能被 3 整除,则打印 "Fizz"。
  • 如果数字只能被 5 整除,则打印 "Buzz"。
  • 如果数字不能被 3 或 5 整除,则打印数字本身。

步骤 5: 在完成循环并将 FizzBuzz 序列打印到用户定义的限制后,关闭 Scanner 对象以释放系统资源。

文件名:FizzBuzz.java

输出

Enter the number up to which you want to play FizzBuzz: 40
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz

不使用取模运算符

步骤 1: 定义两个整数变量 fizzCountbuzzCount,并初始化为零。它们将分别跟踪 3 和 5 的倍数的计数。

步骤 2: 设置一个循环,该循环迭代从 1 到 40(或其他需要的上限)的整数。

对于每次迭代,将 fizzCountbuzzCount 都增加 1。这些计数器用于跟踪何时打印 "Fizz"、"Buzz" 或 "FizzBuzz"。

步骤 3:检查 3 和 5 的倍数的条件

  • 检查 fizzCount 是否等于 3 并且 buzzCount 是否同时等于 5。此条件表示当前数字是 3 和 5 的倍数。
  • 如果为真
    • 打印 "FizzBuzz"。
    • fizzCountbuzzCount 重置为 0,以便为下一个周期重新开始计数。

步骤 4:检查 3 的倍数的条件

  • 如果前一个条件为假,则检查 fizzCount 是否等于 3(表示 3 的倍数,但不一定是 5 的倍数)。
  • 如果为真
    • 打印 "Fizz"。
    • fizzCount 重置为 0,以重新开始计数 3 的倍数。

步骤 5:检查 5 的倍数的条件

  • 如果上述条件为假,则检查 buzzCount 是否等于 5(表示 5 的倍数,但不一定是 3 的倍数)。
  • 如果为真
    • 打印 "Buzz"。
    • buzzCount 重置为 0,以重新开始计数 5 的倍数。

步骤 5: 如果以上任一条件都不满足(当前数字既不是 3 的倍数也不是 5 的倍数),则按原样打印当前数字。

文件名:FizzBuzzNoMod.java

输出

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz