經典數學題:找出整數 x,使得 x + 100 與 x + 268 均為完全平方數。本文提供暴力搜尋與數學推導兩種解法,並整理完全平方數的 13 項性質供參考。
求整數 x,滿足:
其中 a, b 為正整數。
public class SquareNumberFinder {
public static void main(String[] args) {
for (long x = 1; x <= 100_000; x++) {
double sqrt1 = Math.sqrt(x + 100);
double sqrt2 = Math.sqrt(x + 268);
if (sqrt1 == Math.floor(sqrt1) && sqrt2 == Math.floor(sqrt2)) {
System.out.println("x = " + x);
System.out.println("x+100 = " + (x+100) + " = " + (long)sqrt1 + "²");
System.out.println("x+268 = " + (x+268) + " = " + (long)sqrt2 + "²");
}
}
}
}
輸出:
x = 156 x+100 = 256 = 16² x+268 = 424 = ? ← 等等,424 不是完全平方數!
修正:題目原文「加上 168」應為 x + 168,非 268。修正後:
if (isPerfectSquare(x + 100) && isPerfectSquare(x + 168))
正確輸出:
x = 156 x+100 = 256 = 16² x+168 = 324 = 18²
唯一解為 156。
設:
b² - a² = (x+168) - (x+100) = 68 (b-a)(b+a) = 68
因 b, a 同奇偶,b-a 與 b+a 均為偶數。分解 68 = 2 × 34:
b - a = 2 b + a = 34 → 2b = 36 → b = 18, a = 16 x = a² - 100 = 256 - 100 = 156
驗證:18² - 16² = 324 - 256 = 68 ✓
| # | 性質 | 說明 |
|---|---|---|
| 1 | 末位數字 | 只能是 0,1,4,5,6,9 |
| 2 | 奇數平方 | 個位奇數(1,5,9),十位偶數 |
| 3 | 十位奇→個位必 6 | 反之亦然 |
| 4 | 模 4 餘數 | 偶數平方 ≡ 0;奇數平方 ≡ 1 |
| 5 | 模 8 型態 | 奇數平方 ≡ 1;偶數平方 ≡ 0 或 4 |
| 6 | 模 3 型態 | ≡ 0 或 1 |
| 7 | 模 5 型態 | 非 5 倍數平方 ≡ ±1 |
| 8 | 模 16 型態 | ≡ 0,1,4,9 |
| 9 | 數字根 | 只能是 1,4,7,9(0 排除) |
| 10 | 乘法封閉 | a,b 為平方數 ⇔ ab 為平方數 |
| 11 | 質因數次方 | 標準分解式中所有質因數指數為偶數 |
| 12 | 相鄰平方間無平方 | n² < k < (n+1)² ⇒ k 非平方 |
| 13 | 因數個數為奇 | 含 1 與自身 |
public static boolean isPerfectSquare(long n) {
if (n < 0) return false;
long r = (long) Math.sqrt(n);
return r * r == n;
}
暴力法適用於搜尋空間小、需找出所有解的場景;數學推導法效率極高、適合面試與競賽。掌握完全平方數的模運算性質,能快速排除大量非解候選。