一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

数学分析:
由题意我们可以设该数为 x x x,加100后得到的完全平方数为 y 2 y^2 y2,再加168后得到的完全平方数为 z 2 z^2 z2,则有:
{ x + 100 = y 2 y 2 + 168 = z 2 \begin{cases} x+100=y^2 \\ y^2+168=z^2 \end{cases} {x+100=y2y2+168=z2即得: y 2 + 168 = z 2 168 = z 2 − y 2 168 = z 2 − y 2 + y z − y z 168 = ( z + y ) ( z − y ) \begin{aligned} y^2+168 & = z^2 \\ 168 & = z^2-y^2 \\ 168 & =z^2-y^2+yz-yz \\ 168 & = (z+y)(z-y) \\ \end{aligned} y2+168168168168=z2=z2y2=z2y2+yzyz=(z+y)(zy)这里分为四种情况:

  1. y > 0 , z > 0 y>0,z>0 y>0,z>0
  2. y > 0 , z < 0 y>0,z<0 y>0,z<0
  3. y < 0 , z > 0 y<0,z>0 y<0,z>0
  4. y < 0 , z < 0 y<0,z<0 y<0,z<0

若要得到 ( z + y ) ( z − y ) = 168 (z+y)(z-y)=168 (z+y)(zy)=168,那么以上四种情况可以归为两类:

  1. 0 < ( z + y ) < 168 , 0 < ( z − y ) < 168 0<(z+y)<168,0<(z-y)<168 0<(z+y)<1680<(zy)<168
  2. − 168 < ( z + y ) < 0 , − 168 < ( z − y ) < 0 -168<(z+y)<0,-168<(z-y)<0 168<(z+y)<0168<(zy)<0

下面两个图是 y y y z z z z + y z+y z+y z − y z-y zy的值域示意图,左图为 168 = z 2 − y 2 168=z^2-y^2 168=z2y2,右图为 ( z + y ) ( z − y ) = 168 (z+y)(z-y)=168 (z+y)(zy)=168
在这里插入图片描述

实际上,无论 y y y z z z取何值,最终都能得到 y 2 + 168 = z 2 y^2+168=z^2 y2+168=z2,即 y y y z z z的取值不影响最终结果

y-,z-
(z+y)-,(z-y)-
y+,z-
y-,z+
(z+y)+,(z-y)+
y+,z+
y^2+168=z^2

这里设 y y y z z z都取正值,则 z + y z+y z+y z − y z-y zy也为正值且其值大于 0 0 0小于等于 168 168 168

另,由于: x + 100 = y 2 ⩾ 0 x+100=y^2\geqslant 0 x+100=y20因此可得 x ⩾ − 100 x\geqslant -100 x100.

所以我们可以利用的条件就是: { x + 100 = y 2 y 2 + 168 = z 2 z + y ∈ ( 0 , 168 ] z − y ∈ ( 0 , 168 ] x ⩾ − 100 \begin{cases} x+100=y^2 \\ y^2+168=z^2 \\ z+y \in(0,168] \\ z-y\in(0,168]\\ x\geqslant -100 \\ \end{cases} x+100=y2y2+168=z2z+y(0,168]zy(0,168]x100

实现代码如下:

#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

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白水baishui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值