1 题目
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
2 分析
- 方法1(有缺陷,答案不全):直接用暴力解法,由于不知道数的确切范围,所以假定该数在0到10000内进行求解,求解的方法是使用
math.h
的sqrt()
函数求平方根,判断取平方根后是否为整数,若两次取平方根后都为整数,则这个数符合要求,见3.1实现1
,这是最常见的方法,当然也是最容易出错的方法,出错的原因在于在题干没有指定数的范围的时候,自行指定了范围,求解前我们并不知道数的范围,所以有相当大的可能造成求解的遗漏,那么补充第二种方法 - 方法2:本题实际上是一个数学的问题,那么用数学的方法来求解是最稳妥的
① 设这个未知数为 x x x ,那么列出符合题意的式子为:
x + 100 = A 2 x+100=A^2 x+100=A2, x + 268 = B 2 x+268=B^2 x+268=B2 ( A 2 A^2 A2 和 B 2 B^2 B2 为构成的两个完全平方数)
② 得到 A 2 A^2 A2 和 B 2 B^2 B2 的关系,两式相减得: B 2 − A 2 = ( B + A ) ( B − A ) = 168 B^2 - A^2=(B+A)(B-A)=168 B2−A2=(B+A)(B−A)=168
③ 令 ( B + A ) = i (B+A)=i (B+A)=i,令 ( B − A ) = j (B-A)=j (B−A)=j,即 i ∗ j = 168 i*j=168 i∗j=168, i i i 和 j j j 中至少一个为偶数
④ 则 B = i + j 2 B=\frac{i+j}{2} B=2i+j,则 A = i − j 2 A=\frac{i-j}{2} A=2i−j, i i i 和 j j j 奇偶性相同,即 i i i 和 j j j 都是偶数,且大于等于2
⑤ 令循环变量为i
,从 1 1 1循环至 168 2 + 1 \frac{168}{2} + 1 2168+1,通过判断 i i i 和 j j j 就可以求出满足题意的数字,见3.3实现2
3 实现
3.1 实现1(有缺陷,答案不全)
#include<stdio.h>
int main() {
for (int i = 0; i <= 10000; i++) {
if (sqrt(i+100)==(int)sqrt(i+100) && sqrt(i+268)==(int)sqrt(i+268)) {
printf("%d\n", i);
}
}
return 0;
}
3.2 运行结果1(有缺陷,答案不全)
21
261
1581
3.2 实现2
#include<stdio.h>
int main() {
for (int i = 1; i < 168/2 + 1; i++) {
if (168 % i == 0) { // i要能被168整除
int j = 168 / i; // 求出j
if (i > j && (i + j)%2 == 0 && (i - j)%2 == 0) {
int B = (i + j) / 2;
int A = (i - j) / 2;
int x = A * A - 100;
printf("%d\n", x);
}
}
}
return 0;
}
3.3 运行结果2
-99
21
261
1581