第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