數(shù)學(xué)模型:將這個(gè)整數(shù)記為a壳繁,a+100,a+268都是平方數(shù)荔棉,求a的值闹炉。
from math import sqrt
#自定義函數(shù),判斷數(shù)字x是否為一個(gè)完全平方數(shù)润樱,是完全平方數(shù)返回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
運(yùn)行結(jié)果:
反思:這個(gè)算法的運(yùn)行效率是比較慢的,因?yàn)樽兞縤的值是從0壹若,1嗅钻,2,3店展,4养篓,…步長為1遞增的,如果能將步長加大赂蕴,使其按照i=1柳弄,4,9概说,16碧注,25…的方式遞增就可以減少算量了,今天暫時(shí)想到這里糖赔,以后發(fā)現(xiàn)好的算法再更新萍丐。
更新內(nèi)容:
今天換了一個(gè)思路考慮這個(gè)問題,新建一個(gè)列表存放平方數(shù)
[1放典,4碉纺,9,16……]刻撒,如果a+100骨田,和a+268同在這個(gè)列表中,則輸出a的值声怔,為了進(jìn)一步減少算量态贤,將列表的前幾項(xiàng)去掉,因?yàn)閍+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("這個(gè)數(shù)是:",m-268)
break
n += 1
- 運(yùn)行結(jié)果:
這個(gè)數(shù)是: 21
在調(diào)試程序中突發(fā)奇想茬高,將break注釋掉了,結(jié)果發(fā)現(xiàn)這樣的數(shù)字還有
- 注釋掉break的運(yùn)行結(jié)果:
這個(gè)數(shù)是: 21
這個(gè)數(shù)是: 261
這個(gè)數(shù)是: 1581
Process finished with exit code -1
最后的結(jié)果是多少現(xiàn)在還不知道假抄,這三個(gè)數(shù)很快就被算出來了怎栽,等了很久沒有出現(xiàn)新的數(shù)字,因此強(qiáng)行停止了循環(huán)宿饱。等學(xué)完了迭代器與生成器后再來更新程序熏瞄,看看有沒有新的發(fā)現(xiàn)。
第3次更新:
這一次找到了新算法谬以,而不是依靠盲目循環(huán)强饮,思考方法如下:
設(shè)a+100=i2,a+268=j2 为黎,且j>i>10邮丰,根據(jù)平方差公式可知,j2 -i2 =168铭乾,即(j-i)(j+i)=168柠座,說明(j-i),(j+i)是168的兩個(gè)因數(shù)片橡,且(j+i)>13>(j-i)妈经,所以在程序設(shè)計(jì)時(shí),改用將168因數(shù)分解的策略捧书,分解后的兩個(gè)因數(shù)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)
- 運(yùn)行結(jié)果:
1581
261
21