由题意我们可以设该数为 x ,加100后得到的完全平方数为 y 2 ,再加168后得到的完全平方数为 z^2 ,则有
即得:
这里分为四种情况:
y>0,z>0
y > 0 , z < 0
y < 0 , z > 0
y < 0 , z < 0
若要得到 ( z + y ) ( z − y ) = 168 (z+y)(z-y)=168 (z+y)(z−y)=168,那么以上四种情况可以归为两类:
0<(z+y)<168,0<(z−y)<168
− 168 < ( z + y ) < 0 , − 168 < ( z − y ) < 0
下面两个图是 y 、 z、 z + y、 z − y 的值域示意图,左图为168=z^2-y^2 ,右图为 ( z + y ) ( z − y ) = 168
实际上,无论 y与 z取何值,最终都能得到 2 y^2+168=z^2 y
这里设 y 与 z都取正值,则 z + y 、 z − y也为正值且其值大于 0小于等于 168。
另,由于:
x+100=y2⩾0
因此可得 x ⩾ − 100
所以我们可以利用的条件就是:
实现代码如下:
#include "stdio.h" #include "math.h" int main(void) { int x = -100; double y = 0, z = 0; // y+,z+,0<(z+y)<168,0<(z-y)<168 do { y = sqrt(x + 100); z = sqrt(x + 100 + 168); if (y == (int)y && z == (int)z) printf("%d\n", x); x++; } while ((z + y) > 0 && (z + y) <= 168); /* * y与z的另外三种取值,其结果与y+,z+一致 * // y-,z-,-168<(z+y)<0,-168<(z-y)<0 do{ y = -sqrt(x + 100); z = -sqrt(x + 100 + 168); if (y == (int)y && z == (int)z) printf("%d\n", x); x++; } while ((z + y) >= -168 && (z + y) < 0); // y+,z-,-168<(z+y)<0,-168<(z-y)<0 do { y = sqrt(x + 100); z = -sqrt(x + 100 + 168); if (y == (int)y && z == (int)z) printf("%d\n", x); x++; } while ((z + y) >= -168 && (z + y) < 0); // y-,z+,0<(z+y)<168,0<(z-y)<168 do { y = -sqrt(x + 100); z = sqrt(x + 100 + 168); if (y == (int)y && z == (int)z) printf("%d\n", x); x++; } while ((z + y) > 0 && (z + y) <= 168); * * */ return 0; }
计算结果为:-99、21、261、1581