吸血鬼數字是一種特殊的數學概念,指位數為偶數的整數,可以分解為兩個「獠牙」相乘而得。這兩個獠牙各自包含乘積一半的位數,且所有數字皆源自原始數字的重新排列。值得注意的是,以兩個零結尾的數字不被視為合法吸血鬼數字。經典範例包括:1260 = 21 × 60、1827 = 21 × 87。
以下程式碼展示如何找出所有四位數的吸血鬼數字。核心邏輯在於將四位數拆解為千、百、十、個四個數字,再透過排列組合驗證所有可能的兩位數乘積組合。
public class VampireNumberFinder {
public static void findVampireNumbers() {
for (int x = 1000; x < 10000; x++) {
// 拆解四位數的各個位數
int a = x / 1000; // 千位
int b = (x / 100) % 10; // 百位
int c = (x / 10) % 10; // 十位
int d = x % 10; // 個位
// 排除以兩個零結尾的情況
if (c == 0 && d == 0) continue;
// 建立所有可能的兩位數組合陣列
int[] candidates = {
a * 10 + b, b * 10 + a,
a * 10 + c, c * 10 + a,
a * 10 + d, d * 10 + a,
b * 10 + c, c * 10 + b,
b * 10 + d, d * 10 + b,
c * 10 + d, d * 10 + c
};
// 驗證所有兩兩組合的乘積
for (int i = 0; i < candidates.length; i++) {
for (int j = i; j < candidates.length; j++) {
if (candidates[i] * candidates[j] == x) {
System.out.printf("發現吸血鬼數字: %d = %d × %d%n", x, candidates[i], candidates[j]);
break;
}
}
}
}
}
public static void main(String[] args) {
findVampireNumbers();
}
}
程式將輸出以下四位數吸血鬼數字:
上述暴力解法雖然直觀,但可進一步優化:
吸血鬼數字不僅是趣味數學題材,更是演算法設計與排列組合邏輯的優秀練習題目。