3):題目:乙個整數,它加上100後是乙個完全平方數,再加上168又是乙個完全平方數,請問該數是多少?
程式分析:假設該數為 x。1、則:x + 100 = n2, x + 100 + 168 = m2。2、計算等式:m2 - n2 = (m + n)(m - n) = 168。3、設定: m + n = i,m - n = j,i * j =168,i 和 j 至少乙個是偶數。4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要麼都是偶數,要麼都是奇數。5、從 3 和 4 推導可知道,i 與 j 均是大於等於 2 的偶數。6、由於 i * j = 168, j>=2,則1 < i < 168 / 2 + 1。7、接下來將 i 的所有數字迴圈計算即可。
程式源**:
#!/usr/bin/python以上例項輸出結果為:# -*- coding: utf-8 -*-
for i in range(1,85):
if 168 % i == 0:
j = 168 / i;
if i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0 :
m = (i + j) / 2
n = (i - j) / 2
x = n * n - 100
print(x)
-99212611581再來看其它的例子:設該數為x:x + 100 = n^2, n^2 + 168 = m^2。設m=n+k(不妨設m,n,k均為自然數):帶入m^2-n^2-168,得k^2+2nk=168。解得n=84/k - k/2;由於n,k均為自然數,則nk>=1,故1<=k^2<168,故1<=k<=12。
#!/usr/bin/env pythonforx inrange(1,13):a =84/x -x/2ifint(a)==a:n =a **2-100print(n)再來看另外乙個:
#!/usr/bin/python# -*- coding: utf-8 -*-fori inrange(1,85):if168%i ==0:j =168/i還有乙個如下:ifi >j:m =(i +j )/2n =(i -j )/2ifm *m -268==n *n -100and(n *n -100)%1==0:print('x = ',m *m -268)
#!/usr/bin/python# -*- coding: utf-8 -*-form inrange(168):forn inrange(m):if(m+n)*(m-n)==168:x=n**2-100print"符合條件的整數有:",x根據題意可先求出所求數的最大範圍,並在範圍內部迴圈測試是否有滿足條件的數字,若有,則列印出來:
#!/usr/bin/python# -*- coding: utf-8 -*-i =1#求出最大範圍while((i+1)*(i+1)-i*i)<=168:i +=1#迴圈測試並列印forj inrange(1,i):fork inrange(1,i):if(k*k -j*j)==168:printk*k-268再來看乙個:
#!/usr/bin/python# -*- coding: utf-8 -*-#乙個整數,它加上100後是乙個完全平方數,再加上168又是乙個完全平方數,請問該數是多少?'''思路就是根據公式求得x1和x2,然後並集操作。得出結果:分析:設這個整數為x
1、 x+100=n^2和x+100+168=m^2
推出 m^2-n^2=168
即 (m+n)(m-n)=168
設 m+n=i m-n=j
則 i*j=168
由 i>0 j>0 推出 i%2=0 j%2=0
由 168=2*2*2*3*7
上面兩個條件推出i與j值的範圍[2,4,6,12,14,28,42,84]
反推:m=(i+j)/2和n=(i-j)/2 並且 n>0 推得 i>j
則 i=[14,28,42,84]
j=[12,6,4,2]
'''arr1=[14,28,42,84]arr2=[12,6,4,2]fori inrange(0,4):m=(arr1[i]+arr2[i])/2n=(arr1[i]-arr2[i])/2x=n*n-100printx
#!/usr/bin/python# -*- coding: utf-8 -*-#x1=n*2-100的合集x1 =map(lambdai:i**2-100,range(1,100))#x2=m*2-100-168的合集x2 =map(lambdai:i**2-100-168,range(1,100))#兩個合集求並集結果print(set(list(x1))&set(list(x2)))設該數為x:x + 100 = n^2, n^2 + 168 = m^2。設m=n+k(不妨設m,n,k均為自然數):帶入m^2-n^2-168,得k^2+2nk=168。在此基礎上 k(k+2n)=168 , 若 k為奇數,k+2n也為奇數,等式不成立,所以k為偶數。則等式除以4,得(k/2)(k/2+n) =42, 令 t=k/2, (t>0)。t(t+n)=42 則 n= 42/t -t ; 由於n大於0,所以 t小於等於6 ,42/t 又是整數,得到 t 的取值為 1,2,3,6。對應得到 x =1581,261,21,-99。這是純算出來的。
力求使用最簡單易讀的方法解決問題:
來看python3 測試:
>>>print([n**2-100form inrange(168)forn inrange(m)if(m+n)*(m-n)==168])[-99,21,261,1581]因為題目說明x是整數,但沒有說明n和m一定大於零,此處考慮了n和m小於零的情形。x+100=n^2;x+100+168=m^2;(注意,沒有要求m,n一定大於零)。m^2-n^2=168 即 (m+n)(m-n)=168。設 m+n=i,m-n=j,則m=(i+j)/2;n=(i-j)/2 有 i*j=168, 因為 m,n 都是整數且 m!=n, 所以 j,i!=0, 因為i*j是正數,故 abs(i)>=1,abs(j)>=1。所以i和j的上限可以取 168。因此m和n的上限也是168,下限可以取-168(注意,m,n的取值範圍可以放得很大,不影響結果,因為限制條件可以自己去約束,但所取的範圍一定要比真實範圍大)。python3 下測試**如下:
還有乙個參考:
fori inrange(1,17):forx inrange(1,168):if168-(i **2+2*x *i)==0:printx **2-100再來乙個參考:
classnum:def__init__(self):passdefcalc(self):fori inrange(2,86):forj inrange(2,86):if(i *j ==168)and(i >j):#print(i,j)if((i %2==0)and(j %2==0))or((i %2!=0)and(j %2!=0)):n =(i-j)/2d =int(n*n -100)print(d)a =num().calc()先決定範圍,如果(i+1)^2 - i^2 > 168 則超出範圍, 找到i。完全平方定義開根號後為整數 =>。y**0.5 對1取餘數=0 且 z**0.5 對1取餘數=0:
i=0whilei^2<168:i+=1forx inrange(-i**2,i*i):y=x+100z=y+168a=complex(y+0j)**0.5%1b=complex(z+0j)**0.5%1c=a%1d=b%1ifc==d ==0:printx最後來看個例子:
#!/usr/bin/python# coding=utf-8# x^2 + 168 = y^2,則x、y都小於168,而且x應小於yfory inrange(168):forx inrange(y):ify**2-x**2==168:n =x**2-100printn不得不說,奇思妙想啊。。。對於本人來說,很難達到這種程度的。如果感覺不錯的話,請多多點贊支援哦。。。
python2 7練習小例子(十二)
12 題目 列印出所有的 水仙花數 所謂 水仙花數 是指乙個三位數,其各位數字立方和等於該數本身。例如 153是乙個 水仙花數 因為153 1的三次方 5的三次方 3的三次方。程式分析 利用for迴圈控制100 999個數,每個數分解出個位,十位,百位。程式源 usr bin python codi...
python2 7練習小例子(九)
9 1 題目 暫停一秒輸出。程式分析 使用 time 模組的 sleep 函式。程式源 usr bin python coding utf 8 import time myd for key,value in dict.items myd print key,value time.sleep 1 暫...
python2 7練習小例子(七)
7 題目 將乙個列表的資料複製到另乙個列表中。程式分析 使用列表 程式源 usr bin python coding utf 8 a 1,2,3 b a print b 以上例項輸出結果為 1,2,3 importcopy a 1,2,3 b copy.copy a print b 1,2,3 a ...