我一直在嘗試解決這個問題:
求 a,b,c 的正整數解,滿足 1≤a<b<c≤30 且 b/a c/b a/c 為正整數。
所以我用python寫了這個:
for i,j,m in range(1,31):
if i<=j and j<=m and j/i m/j i/m>=0:
try:
print(int(j/i m/j i/m))
except TypeError:
continue
然而它沒有用。
和錯誤資訊:
for i,j,m in range(1,31):
TypeError: cannot unpack non-iterable int object
uj5u.com熱心網友回復:
您要分配 3 個變數,range()只回傳一個值的“串列”。
我不確定您要做什么,但我懷疑您想嘗試i,j和的每種值組合m。一種方法是創建嵌套回圈。每個回圈將迭代一個變數的值。
另一種解決方案是使用itertools并創建將由您的函式處理的所有組合的串列(這需要一些小的調整)。
uj5u.com熱心網友回復:
迭代三元組
range回傳單個整數的可迭代。要遍歷三元組,您可以嵌套三個回圈,或者使用itertools:
# using nested loops
for a in range(1, 29):
for b in range(a 1, 30):
for c in range(b 1, 31):
...
# using itertools
from itertools import combinations
for a,b,c in combinations(range(1,31), 3):
...
請注意,在這兩種情況下,我都撰寫了回圈來直接迭代(a,b,c)滿足a < b < c. 這比遍歷所有三元組(a,b,c),然后過濾條件要有效得多a < b < c。
測驗是否b/a c/b a/c是整數
在處理具有不同分母的分數時,首先要做的通常是將所有內容放在一個共同的分母上。在這種情況下,三個分數的總和b/a c/b a/c等于 fraction (b*b*c c*a*c a*a*b) / (a*b*c)。測驗這個分數是否為整數就是測驗它的分子是否能被它的分母整除。這可以通過模運算子輕松實作%。
if (b*b*c c*a*c a*a*b) % (a*b*c) == 0:
...
如果結果看起來像一個整數,這實際上比使用浮點除法和測驗要好。浮點除法產生二進制浮點數。并非所有數字都可以用二進制浮點數精確表示:就像分數1/3不能用十進制精確表示一樣,許多數字也不能用二進制精確表示。想象一下測驗是否1/3 1/3 1/3是整數:如果1/3四舍五入到0.333,那么我們將得到0.333 0.333 0.333 == 0.999,它不是整數。這是一個近似誤差。如果可能,在處理整數運算時,始終只使用整數,而不要使用浮點除法。保護自己免受浮點近似!
將演算法邏輯與輸入/輸出分離
將處理演算法和算術的代碼部分與處理列印到螢屏、讀取和寫入檔案等的代碼部分分開是非常好的做法。
您可以將所有找到的三元組附加到一個串列中,然后回傳該串列:
def get_triplet_list(n):
l = []
for a,b,c in combinations(range(1, n 1), 3):
if (b*b*c c*a*c a*a*b) % (a*b*c) == 0:
l.append((a,b,c))
return l
def main():
l = get_triplet_list(30)
for a,b,c in l:
print(a,b,c)
if __name__ == '__main__':
main()
# 2 9 12
# 3 4 18
# 4 18 24
或使用串列推導:
def get_triplet_list(n):
return [(a,b,c) for a,b,c in combinations(range(1, n 1), 3) if (b*b*c c*a*c a*a*b) % (a*b*c) == 0]
def main():
l = get_triplet_list(30)
for a,b,c in l:
print(a,b,c)
if __name__ == '__main__':
main()
或者使用生成器函式,用關鍵字yield代替return:
def gen_triplets(n):
for a,b,c in combinations(range(1, n 1), 3):
if (b*b*c c*a*c a*a*b) % (a*b*c) == 0:
yield (a,b,c)
def main():
for a,b,c in gen_triplets(30):
print(a,b,c)
if __name__ == '__main__':
main()
uj5u.com熱心網友回復:
試試這個:根據問題陳述,1≤a<b<c≤30 and b/a c/b a/c >0
for i in range(1,31):
for j in range(1,31):
for m in range(1,31):
if i<j and j<m and j/i m/j i/m>0:
try:
print(int(j/i m/j i/m))
except TypeError:
continue
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/455645.html
