题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
解题思路:此题表面信息量少之又少,看上去很不好解。并且只是说一个整数,并没有给边界,所以自定义边界值为1000,设该数字为x.继续阅题,貌似突破口只有完全平方数,回忆数学中完全平方数的特性,看起来也没有什么明显的突破口。再思考,既然是完全平方数,那么是否可以判断sqrt()后的结果为int类型呢?查阅python官方文档,sqrt()结果都是float类型,如果将float类型转换成int类型,又无法判断该数字是否是完全平方数。再想方法,将sqrt()的结果转换为列表,如果最后一个元素是0,则证明这个结果就是整数,这样就间接证明了x+100和x+100+168的数一定是完全平方数。但是如何将一个float类型的数字转换为列表呢?可以先将float类型转换为str类型,使用str的split方法将str转换为列表。
代码如下:
import math
for x in range(0,1000):
a = math.sqrt(x+100)
b = math.sqrt(x+100+168)
a = str(a).split('.')
b = str(b).split('.')
if a[len(a)-1] == '0'and b[len(b)-1]=='0':
print x
在网上查找解题方法,还看到一种简单的方法,先贴出来以作学习:
import math
for i in range(10000):
x = int(math.sqrt(i + 100))
y = int(math.sqrt(i + 268))
if(x * x == i + 100) and (y * y == i + 268):
print i
该方法使用了一个恒等的概念,先将数字i+100和i+100+168开方得出x和y,再使用x和y分别平方等于i+100和i+100+168.这种方法比我自己的方法更简单。
在网上看到一串代码,使用math.abs方法,求绝对值判断该数字是否是整数,给我另一种解题思路。
import math
def is_sqr(x):
a = math.sqrt(x+100)
b = math.sqrt(x+100+168)
if abs(a-round(a)) < 0.00000001 and abs(b-round(b)) < 0.00000001:
return x
print filter(is_sqr,range(1,1000))
filter是python的一个内建函数,用于过滤序列,具体可参考如下网址:
https://docs.python.org/2.7/search.html?q=filter
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001418612030427b1f1cf4ea04c41368e8a6753dca43070000
在网上也看到有人用is_integer来判断一个float是否是整数,但是也有人说这个判断并不是太准确,所以不推荐使用该方法判断,不过也贴出使用is_integer 的代码。
import math
def is_sqr(x):
return math.sqrt(x+100).is_integer() and math.sqrt(x+100+168).is_integer()
print filter(is_sqr, range(1, 1000)
同时,在最后贴出给了我思路使用abs方法的源代码:
import math
def isPP(n):
m=2
res=[]
while m<=round(math.sqrt(n)):
mid=math.log(n,m)
if abs(mid-round(mid))<0.000000001:
res.append(m)
res.append(int(round(mid)))
break
m+=1
if len(res)==0:return None
return res