y = sqrt(x + 100);
z = sqrt(x + 268);
if ((y * y == x + 100) && (z * z == x + 268)) // 浮點比較不可靠
`sqrt` 返回 `double`,浮點運算存在誤差,`y*y` 可能不精確等於整數,導致判斷失效。
int isPerfectSquare(int n) {
int r = (int)(sqrt(n) + 0.5); // 四捨五入取整
return r * r == n;
}
#include <stdio.h>
#include <math.h>
int isPerfectSquare(int n) {
int r = (int)(sqrt(n) + 0.5);
return r * r == n;
}
int main() {
for (int x = 1; x < 100000; x++) {
if (isPerfectSquare(x + 100) && isPerfectSquare(x + 268)) {
printf("%d\n", x);
break; // 題目通常只有一解
}
}
return 0;
}
設 x + 100 = a², x + 268 = b² → b² - a² = 168 → (b-a)(b+a) = 168。枚舉 168 的因子對即可 O(√168) 求解,無需暴力循環 10 萬次。
21
驗證:21+100=121=11²,21+268=289=17²。