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

分析:

        完全平方数的定义:若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。所以完全平方数不是负数,但题目所求数却可能是负数,下面讨论这种情况。

      先用数学分析:

  • 令该数为x
  • 依题意有:x+100=n*n    ;    x+100+168=m*m
  • 则:m^2-n^2=168=(m+n)(m-n)    //分解因式
  • 令:m+n=i   ;   m-n=j   
  • 即:i*j=168    //因为168 是一个偶数,所以i和j至少一个是偶数
  • 由{   m+n=i   ;   m-n=j    }
  • 可得 {  m=(i+j)/2   ;   n=(i-j)/2  }
  • 因为 {  2m=(i+j)   ;   2n=(i-j)  }可知 i 和 j 的合或差是偶数,所以 i 和 j 奇偶性相同

//奇数和偶数的一些性质 :奇偶性相同的两个数的和或差为偶数;反之也成立,即:两个整数的和

//或 差为偶数,这两个数奇偶性相同

  • 即:i 和 j 要么都是偶数,要么都是奇数
  • 因为i*j=168 ,i和j至少一个是偶数,所以i和j都是偶数
  • 由于 i * j = 168, j>=2,这里取 i>j 

//解释一下i>j的意思:例如48=i*j=1*48=2*24=3*16=4*12=6*8=8*6=12*4=16*3=24*2=48*1,

//由此可见i和j在6*8处其实是交换(i*j=j*i)了,也就是说,只需找出i>j条件下值即可

  • 则 1 < i < 168 / 2 + 1
  • 接下来将 i 的所有数字依次带入循环计算即可

代码实现:

#include<stdio.h>
int main(void)
{
	int i, j, m, n, x;
	for (i = 1; i <= 168 / 2 + 1; i++)
	{
		if (168 % i == 0)   //排除i中的奇数
		{
			j = 168 / i;
			if (i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)
			{
				m = (i + j) / 2;
				n = (i - j) / 2;
				x = n * n - 100;
				printf("%d + 100 = %d * %d\n", x, n, n);
				printf("%d + 100 + 168 = %d * %d\n", x, m, m);
			}
		}
	}
	return 0;
}

运行结果:

-99 + 100 = 1 * 1
-99 + 100 + 168 = 13 * 13
21 + 100 = 11 * 11
21 + 100 + 168 = 17 * 17
261 + 100 = 19 * 19
261 + 100 + 168 = 23 * 23
1581 + 100 = 41 * 41
1581 + 100 + 168 = 43 * 43

D:\program\usual\vs\cdy\Debug\cdy.exe (进程 16380)已退出,代码为 0。
按任意键关闭此窗口. 

    其中,当数为负数-99时,也满足题目要求。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值