設該整數為 x。根據題意:
x + 100 = a² (a 為整數)x + 268 = b² (b 為整數,因 100+168=268)兩式相減得:b² - a² = 168,即 (b - a)(b + a) = 168。
設 m = b - a, n = b + a,則 m * n = 168,且 m, n 同奇偶(因 b = (m+n)/2, a = (n-m)/2 需為整數)。
168 的因數對(同奇偶):
| m | n | a=(n-m)/2 | b=(m+n)/2 | x=a²-100 |
|---|---|---|---|---|
| 2 | 84 | 41 | 43 | 1581 |
| 4 | 42 | 19 | 23 | 261 |
| 6 | 28 | 11 | 17 | 21 |
| 12 | 14 | 1 | 13 | -99 |
#include <stdio.h>
#include <math.h>
int main() {
long int i, x, y;
printf("滿足條件的整數有:\n");
for (i = -100000; i <= 100000; i++) { // 擴展到負數範圍
x = sqrt(i + 100);
y = sqrt(i + 268);
// 判斷完全平方數:開方後平方等於原數
if (x * x == i + 100 && y * y == i + 268) {
printf("%ld ", i);
}
}
printf("\n");
return 0;
}
滿足條件的整數有: -99 21 261 1581
b² - a² = 168 可知 b > a ≥ 0,遍歷 a 即可,計算 b² = a² + 168 判斷是否為完全平方數,範圍縮減至 sqrt(MAX)。sqrt 精度問題,可用二分查找或牛頓法實現整數開方。本題核心在於將「完全平方數」條件轉化為平方差因式分解模型。數學解法優於暴力枚舉,體現了「化繁為簡」的算法思想。C 語言實現時需注意 sqrt 浮點精度陷阱,工程中推薦使用整數運算判斷完全平方數。