點擊頭像,可查看合集
《50個與數學有關的Python編程》介紹很多青少年在初學編程時,不知道如何練習。算法太高深難懂;應用嘛,内容又太多太雜。筆者認為,與數學有關的編程是再合适不過的。
适合誰?熱愛編程的青少年,或者剛步入編程的小白。創作完成後,會提供源碼下載。
内容包括:
50個與數學有關的Python編程之思維導圖
上一篇(餘數)
<<<正文開始>>>第2節 最大公約數和最小公倍數最大公約數和最小公倍數是小學的内容。兩個分數相加時,就會用到它。如
先求6和4的最小公倍數,加好之後,再求分子分母的最大公約數。
題1 笨方法
笨方法就是找出兩個數最大值和最小值,從最大值遞增,直至找到最小公倍數;從最小值遞減,直至找到最大公約數。
N = eval(input("請輸入第一個正整數:"))
M = eval(input("請輸入第二個正整數:"))
'''
#if-else找最大值與最小值
if M > N:
max = M
min = N
else:
max = N
min = M
'''
'''
#三元運算獲得最大值與最小值
min = M if N > M else N
max = N if N > M else M
'''
#也可以用元組來找最大值與最小值
(min, max) = (N, M) if N < M else (M, N)
while True:
if max % M == 0 and max % N == 0:
break
max = max 1
while True:
if M % min == 0 and N % min == 0:
break
min = min - 1
print(max,min)
題2 九章算法
笨方法之所以笨,在于适合計算機,并不适合人。而古代是沒有計算機的。因此《九章算術》給出了一個适合人的比較實用的算法。《九章算術》是中國古代最重要的數學著作。中國古代的數學講究的就是實用。
如:輸入14和6。14-6=8 →8-6=2→6-2=4→4-2=2→2-2=0;2就為最大公約數。最小公倍數為14×6÷2=42。
N = eval(input("請輸入第一個正整數:"))
M = eval(input("請輸入第二個正整數:"))
(min,max) = (M,N) if N > M else (N,M)
while True:
max = max - min
(min, max) = (min, max) if max > min else (max, min)
if min == 0:
break
print(f"最大公約數是{max}")
print(f"最小公倍數是{int(N*M/max)}")
題3 歐幾裡得算法
歐幾裡得是古希臘時代偉大的數學家,其所著的《幾何原本》是平面幾何的基礎。因此我們在中學所學的幾何也叫“歐幾裡得幾何”,簡稱“歐氏幾何”
如:輸入14和6。14 mod 6=2→6 mod 2=0;2就為最大公約數。最小公倍數為14×6÷2=42。
N = eval(input("請輸入第一個正整數:"))
M = eval(input("請輸入第二個正整數:"))
(min,max) = (M,N) if N > M else (N,M)
while True:
max = max % min #大數對小數的求餘
if max == 0:
break
(max, min) = (min, max) #餘數一定會小于除數,
#所以直接調換,不用判斷
print(f"最大公約數是{min}")
print(f"最小公倍數是{int(N*M/min)}")
兩種算法誰更優秀呢?我恐怕要說是歐幾裡得的算法了。從上面14和6的案例來看,歐氏算法的次數要少很多——也就是循環少了很多。
題4 歐幾裡得算法的遞歸寫法
在很多編程比賽中,遞歸是免不了的。歐氏算法的遞歸往往是一道開胃小菜,因此我們在此編一下。
N = eval(input("請輸入第一個正整數:"))
M = eval(input("請輸入第二個正整數:"))
#gcd是 Greatest Common Divisor 的縮寫
def gcd(max,min):
max = max % min
if max == 0:
return min
else:
return gcd(min,max)
(min,max) = (M,N) if N > M else (N,M)
result = gcd(max,min)
print(f"最大公約數是{result}")
print(f"最小公倍數是{int(N*M/result)}")
遞歸算法與非遞歸算法,沒有優劣之分。它們循環的次數是一樣的。本人比較反感用多個方法求解一個問題,但做編程練習時,多思考是一件非常好的事情。
有興趣的朋友,可以将九章算法改成遞歸形式。
點個關注
上一篇(餘數)
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!