2021-01-17 第3题 寻找平方数

第3题

数学模型:将这个整数记为a,a+100,a+268都是平方数,求a的值。

from math import sqrt
#自定义函数,判断数字x是否为一个完全平方数,是完全平方数返回True,否则返回False
def perfect_square(x):
    for i in range(1,int(sqrt(x))+1):
        if i**2 == x:
            return True
            break
    else:
        return False

i = 0
while 1:
    if perfect_square(i+100) == True and perfect_square(i+268) == True:
        print(i)
        break
    else:
        i += 1

运行结果:


运行结果

反思:这个算法的运行效率是比较慢的,因为变量i的值是从0,1,2,3,4,…步长为1递增的,如果能将步长加大,使其按照i=1,4,9,16,25…的方式递增就可以减少算量了,今天暂时想到这里,以后发现好的算法再更新。


更新内容:

今天换了一个思路考虑这个问题,新建一个列表存放平方数
[1,4,9,16……],如果a+100,和a+268同在这个列表中,则输出a的值,为了进一步减少算量,将列表的前几项去掉,因为a+100必须大于等于0,所以列表从100开始,即[100,121,144,225……]

  • 解法2源代码:
#解法2
n = 10
square = []
while 1:
    m = n**2
    square.append(m)
    if m-168 in square:
        print("这个数是:",m-268)
        break
    n += 1
  • 运行结果:
这个数是: 21

在调试程序中突发奇想,将break注释掉了,结果发现这样的数字还有

  • 注释掉break的运行结果:
这个数是: 21
这个数是: 261
这个数是: 1581

Process finished with exit code -1

最后的结果是多少现在还不知道,这三个数很快就被算出来了,等了很久没有出现新的数字,因此强行停止了循环。等学完了迭代器与生成器后再来更新程序,看看有没有新的发现。


第3次更新:

这一次找到了新算法,而不是依靠盲目循环,思考方法如下:

设a+100=i2,a+268=j2 ,且j>i>10,根据平方差公式可知,j2 -i2 =168,即(j-i)(j+i)=168,说明(j-i),(j+i)是168的两个因数,且(j+i)>13>(j-i),所以在程序设计时,改用将168因数分解的策略,分解后的两个因数m,n分别赋值给(j+i)=m和(j-i)=n,因此i=(m-n)/2,j=(m+n)/2,因此a=((m-n)/2)2 -100或者a=((m+n)/2)2 -268

  • 解法3源代码:
from math import sqrt

def iseven(x):
    return True if x % 2 == 0 else False

def factor(x):
    lst = []
    for i in range(2,int(sqrt(x))+1):
        if x % i == 0:
            m = i
            n = x // i
            lst.append((m,n))
    return lst

if __name__ == '__main__':
    lst = factor(168)
    for i in lst:
        t = i[1]-i[0]
        if t > 10 and iseven(t) == True:
            a = (t//2)**2 -100
            print(a)
  • 运行结果:
1581
261
21

你可能感兴趣的:(2021-01-17 第3题 寻找平方数)