給定三個特殊數字 a, b, c(通常為 3, 5, 7),對範圍 [start, end] 內的每個整數:
a(個位或十位) → 輸出 Fizz(優先級最高)。a 整除 → Fizz。b 整除 → Buzz。c 整除 → Whizz。a,b 整除 → FizzBuzz。a,c 整除 → FizzWhizz。b,c 整除 → BuzzWhizz。優先級:包含數字 > 組合整除 > 單一整除 > 數字本身。
public class FizzBuzzWhizz {
public static void main(String[] args) {
fizzBuzzWhizz(1, 100, 3, 5, 7);
}
/**
* @param start 起始數字(含)
* @param end 結束數字(含)
* @param a 特殊數字 A(預設 3)
* @param b 特殊數字 B(預設 5)
* @param c 特殊數字 C(預設 7)
*/
public static void fizzBuzzWhizz(int start, int end, int a, int b, int c) {
String[] out = {"Fizz", "Buzz", "Whizz", "FizzBuzz", "FizzWhizz", "BuzzWhizz"};
for (int i = start; i <= end; i++) {
int idx = -1;
// 1. 最高優先級:數字包含 a
boolean containsA = (i % 10 == a) || (i / 10 == a); // 兩位數足夠,大數可用 String.contains
if (containsA) idx = 0; // Fizz
// 2. 組合整除(按優先級:ab > ac > bc)
if (idx == -1) {
if (i % a == 0 && i % b == 0) idx = 3; // FizzBuzz
else if (i % a == 0 && i % c == 0) idx = 4; // FizzWhizz
else if (i % b == 0 && i % c == 0) idx = 5; // BuzzWhizz
}
// 3. 單一整除
if (idx == -1) {
if (i % a == 0) idx = 0; // Fizz
else if (i % b == 0) idx = 1; // Buzz
else if (i % c == 0) idx = 2; // Whizz
}
// 4. 輸出
System.out.println(idx == -1 ? i : out[idx]);
}
}
}
| 順序 | 條件 | 輸出 | 備註 |
|---|---|---|---|
| 1 | 數字包含 a(如 13, 30, 31...) | Fizz | 最高優先級,無論是否能整除 |
| 2 | 能被 a,b 整除 | FizzBuzz | |
| 3 | 能被 a,c 整除 | FizzWhizz | |
| 4 | 能被 b,c 整除 | BuzzWhizz | |
| 5 | 能被 a 整除 | Fizz | |
| 6 | 能被 b 整除 | Buzz | |
| 7 | 能被 c 整除 | Whizz | |
| 8 | 以上皆無 | 數字本身 |
// 替換 containsA 判斷
boolean containsA = String.valueOf(i).contains(String.valueOf(a));
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class FizzBuzzWhizzTest {
@Test void testContains3() { assertEquals("Fizz", run(13, 3, 5, 7)); }
@Test void testDiv3() { assertEquals("Fizz", run(6, 3, 5, 7)); }
@Test void testDiv5() { assertEquals("Buzz", run(10, 3, 5, 7)); }
@Test void testDiv7() { assertEquals("Whizz", run(14, 3, 5, 7)); }
@Test void testDiv3And5() { assertEquals("FizzBuzz", run(15, 3, 5, 7)); }
@Test void testDiv3And7() { assertEquals("FizzWhizz", run(21, 3, 5, 7)); }
@Test void testDiv5And7() { assertEquals("BuzzWhizz", run(35, 3, 5, 7)); }
@Test void testNormal() { assertEquals("11", run(11, 3, 5, 7)); }
private String run(int n, int a, int b, int c) {
// 呼叫核心邏輯並捕獲輸出
return "..."; // 略
}
}
if-else 順序錯誤。String.contains 而非數學運算。