python 100例之例三

题目:一个整数,它加上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 

猜你喜欢

转载自blog.csdn.net/u012209424/article/details/78666947
今日推荐