本文收錄在Python從入門到精通系列文章系列 學完前面的幾個章節後,博主覺得有必要在這裡帶大家做一些練習來鞏固之前所學的知識,雖然迄今為止我們學習的內容只是Python的冰山一角,但是這些內容已經足夠我們來構建程式中的邏輯。對於編程語言的初學者來說,在學習了Python的核心語言元素(變數、類型、 ...
本文收錄在Python從入門到精通系列文章系列
學完前面的幾個章節後,博主覺得有必要在這裡帶大家做一些練習來鞏固之前所學的知識,雖然迄今為止我們學習的內容只是Python的冰山一角,但是這些內容已經足夠我們來構建程式中的邏輯。對於編程語言的初學者來說,在學習了Python的核心語言元素(變數、類型、運算符、表達式、分支結構、迴圈結構等)之後,必須做的一件事情就是嘗試用所學知識去解決現實中的問題,換句話說就是鍛煉自己把用人類自然語言描述的演算法(解決問題的方法和步驟)翻譯成Python代碼的能力,而這件事情必須通過大量的練習才能達成。
博主在本章為大家整理了一些經典的案例和習題,希望通過這些例子,一方面幫助大家鞏固之前所學的Python知識,另一方面幫助大家瞭解如何建立程式中的邏輯以及如何運用一些簡單的演算法解決現實中的問題。
警告警告:本篇非常燒腦,建議十八歲之上觀看;十八歲之下,建議父母陪同觀看!!!(哈哈哈,開個玩笑~)
1. 經典的例子
1.1 尋找水仙花數。
說明:水仙花數也被稱為超完全數字不變數、自戀數、自冪數、阿姆斯特朗數,它是一個3位數,該數字每個位上數字的立方之和正好等於它本身,例如:$1^3 + 5^3+ 3^3=153$。
""" 找出所有水仙花數 Version: 0.1 Author: along """ for num in range(100, 1000): low = num % 10 mid = num // 10 % 10 high = num // 100 if num == low ** 3 + mid ** 3 + high ** 3: #print(low,mid,high) print(num)
在上面的代碼中,我們通過整除和求模運算分別找出了一個三位數的個位、十位和百位,這種小技巧在實際開發中還是常用的。
1.2 將一個正整數反轉
用類似的方法,我們還可以實現將一個正整數反轉,例如:將12345變成54321,代碼如下所示。
""" 正整數的反轉 Version: 0.1 Author: along """ num = int(input('num = ')) reversed_num = 0 while num > 0: reversed_num = reversed_num * 10 + num % 10 num //= 10 #print(reversed_num,num) print(reversed_num)
1.3 百錢百雞問題
說明:百錢百雞是我國古代數學家張丘建在《算經》一書中提出的數學問題:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?翻譯成現代文是:公雞5元一隻,母雞3元一隻,小雞1元三隻,用100塊錢買一百隻雞,問公雞、母雞、小雞各有多少只?
""" 《百錢百雞》問題 Version: 0.1 Author: along """ for x in range(0,20): for y in range(0,33): z = 100 - x - y if 100 == 5 * x + 3 * y + z / 3: print('公雞: %d只, 母雞: %d只, 小雞: %d只' % (x, y, z))
上面使用的方法叫做窮舉法,也稱為暴力搜索法,這種方法通過一項一項的列舉備選解決方案中所有可能的候選項並檢查每個候選項是否符合問題的描述,最終得到問題的解。這種方法看起來比較笨拙,但對於運算能力非常強大的電腦來說,通常都是一個可行的甚至是不錯的選擇,而且問題的解如果存在,這種方法一定能夠找到它。
1.4 CRAPS賭博游戲
說明:CRAPS又稱花旗骰,是美國拉斯維加斯非常受歡迎的一種的桌上賭博游戲。該游戲使用兩粒骰子,玩家通過搖兩粒骰子獲得點數進行游戲。簡單的規則是:玩家第一次搖骰子如果搖出了7點或11點,玩家勝;玩家第一次如果搖出2點、3點或12點,莊家勝;其他點數玩家繼續搖骰子,如果玩家搖出了7點,莊家勝;如果玩家搖出了第一次搖的點數,玩家勝;其他點數,玩家繼續要骰子,直到分出勝負。
""" Craps賭博游戲 我們設定玩家開始游戲時有1000元的賭註 游戲結束的條件是玩家輸光所有的賭註 Version: 0.1 Author: along """ from random import randint money = 1000 while money > 0: print('你的總資產為:', money) needs_go_on = False while True: debt = int(input('請下註: ')) if 0 < debt <= money: break first = randint(1, 6) + randint(1, 6) print('玩家搖出了%d點' % first) if first == 7 or first == 11: print('玩家勝!') money += debt elif first == 2 or first == 3 or first == 12: print('莊家勝!') money -= debt else: needs_go_on = True while needs_go_on: needs_go_on = False current = randint(1, 6) + randint(1, 6) print('玩家搖出了%d點' % current) if current == 7: print('莊家勝') money -= debt elif current == first: print('玩家勝') money += debt else: needs_go_on = True print('你破產了, 游戲結束!')
註:這個太燒腦了,博主已經破產了(笑哭~)
2. 有用的練習
2.1 生成斐波那契數列的前20個數。
說明:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,是義大利數學家萊昂納多·斐波那契(Leonardoda Fibonacci)在《計算之書》中提出一個在理想假設條件下兔子成長率的問題而引入的數列,所以這個數列也被戲稱為"兔子數列"。斐波那契數列的特點是數列的前兩個數都是1,從第三個數開始,每個數都是它前面兩個數的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...。斐波那契數列在現代物理、準晶體結構、化學等領域都有直接的應用。
參考答案:
""" 輸出斐波那契數列的前20個數 1 1 2 3 5 8 13 21 ... Version: 0.1 Author: along """ a = 0 b = 1 for _ in range(20): a, b = b, a + b print(a, end=' ')
2.2 找出10000以內的完美數。
說明:完美數又稱為完全數或完備數,它的所有的真因數(即除了自身以外的因數)的和(即因數函數)恰好等於它本身。例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美數。完美數有很多神奇的特性,有興趣的可以自行瞭解。
""" 找出1~9999之間的所有完美數 完美數是除自身外其他所有因數的和正好等於這個數本身的數 例如: 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14 Version: 0.1 Author: along """ import math for num in range(1, 10000): result = 0 for factor in range(1, int(math.sqrt(num)) + 1): if num % factor == 0: result += factor if factor > 1 and num // factor != factor: result += num // factor if result == num: print(num)
2.3 輸出100以內所有的素數。
說明:素數指的是只能被1和自身整除的正整數(不包括1)。
""" 輸出2~99之間的素數 Version: 0.1 Author: along """ import math for num in range(2, 100): is_prime = True for factor in range(2, int(math.sqrt(num)) + 1): if num % factor == 0: is_prime = False break if is_prime: print(num, end=' ')