一个整数,它加上100 后是一个完全平方数,再加上168 又是一个完全平方数,请问该数是多少?
注:若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。例如1*1,2*2,3*3等,依此类推。
#####方法一#####
i=0
while ( (i+100)**0.5!=int((i+100)**0.5)) or ((i+268)**0.5!=int((i+268)**0.5)):
i+=1
print(i)
【分析】
相信大家的焦点都停留在如何判定一个数是完全平方数上,只要想到完全平方数开方后没有小数,问题就迎刃而解了。因此,这道题似乎没什么困难,用穷举很快就找到了结果。
但细心的你仔细想想,是不是发觉有些问题呢?
第一,只说一个整数,难道整数一定是从0开始吗?
第二,用穷举的方法找到一个解后就停止了继续搜索,是不是问题就只有一个解呢?题目并没有这么说。
所以,方法一存在着思维漏洞,不是完美解法。
【完善】
由于完全平方数必须是正整数,因此从题目可以知道,这个数必须大于等于-100,下限可以确定。但上限怎么确定呢?
这个要紧紧抓住后面的条件——“再加168后又是一个完全平方数”。两个连续完全平方数我们可以记做n*n、(n+1)*(n+1).两者的差可以表示为:(n+1)*(n+1)-n*n=2n+1 . 随着n的变大,两个连续完全平方数之间的差(间距)也将变大。当n增大到间距(n+1)*(n+1)-n*n已经是168时(假设),那我们可以断定,后面不会再出现完全平方数加168后又出现一个完全平方数的情况。那这个数的上限应该就是当前的n*n-100.
在分析得出搜索区间的基础上,我们可以写出如下代码:
#####方法二#####
n=0
while (n+1)**2-n*n<=168:
n+=1
for i in range(-100,n*n-100):
if (i+100)**0.5==int((i+100)**0.5) and (i+268)**0.5==int((i+268)**0.5):
print(i)
当然,你也可以直接找符合条件的完全平方数,找到后倒退100得到原来的数。
#####方法三#####
n=0
while (n+1)**2-n*n<=168:
n+=1
for i in range(n**2): #完全平方数肯定是大于等于0的
if i**0.5==int(i**0.5) and (i+168)**0.5==int((i+168)**0.5):
print(i-100)