python構造程序邏輯

本文收錄在Python從入門到精通系列文章系列html

  學完前面的幾個章節後,博主以爲有必要在這裏帶你們作一些練習來鞏固以前所學的知識,雖然迄今爲止咱們學習的內容只是Python的冰山一角,可是這些內容已經足夠咱們來構建程序中的邏輯。對於編程語言的初學者來講,在學習了Python的核心語言元素(變量、類型、運算符、表達式、分支結構、循環結構等)以後,必須作的一件事情就是嘗試用所學知識去解決現實中的問題,換句話說就是鍛鍊本身把用人類天然語言描述的算法(解決問題的方法和步驟)翻譯成Python代碼的能力,而這件事情必須經過大量的練習才能達成。算法

  博主在本章爲你們整理了一些經典的案例和習題,但願經過這些例子,一方面幫助你們鞏固以前所學的Python知識,另外一方面幫助你們瞭解如何創建程序中的邏輯以及如何運用一些簡單的算法解決現實中的問題。編程

  警告警告:本篇很是燒腦,建議十八歲之上觀看;十八歲之下,建議父母陪同觀看!!!(哈哈哈,開個玩笑~)dom

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塊錢買一百隻雞,問公雞、母雞、小雞各有多少隻?spa

"""
《百錢百雞》問題

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點,莊家勝;若是玩家搖出了第一次搖的點數,玩家勝;其餘點數,玩家繼續要骰子,直到分出勝負。code

"""
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=' ')
相關文章
相關標籤/搜索