python構造程式邏輯

来源:https://www.cnblogs.com/along21/archive/2019/11/12/11845978.html
-Advertisement-
Play Games

本文收錄在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=' ')

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以思維導圖的方式呈現: 鏈接: https://naotu.baidu.com/file/9b3e739442ffb9f5bc5c3cee2b1a3489 png圖片: 作者:流浪者 日期:2019-11-13 ...
  • Nginx 進程結構 這篇文章我們來看下 Nginx 的進程結構,Nginx 其實有兩種進程結構: 單進程結構 多進程結構 單進程結構實際上不適用於生產環境,只適合我們做開發調試使用。因為在生產環境中我們必須保持 Nginx 足夠健壯以及 Nginx 可以利用多核的一個特性,而單進程的 Nginx ...
  • 異常的概念 異常,就是不正常的意思。在生活中:醫生說,你的身體某個部位有異常,該部位和正常相比有點不同,該部位的功能將受影響.在程式中的意思就是:指的是程式在執行過程中,出現的非正常的情況,終會導致JVM的非正常停止 註意:在Java等面向對象的編程語言中,異常本身是一個類,產生異常就是創建異常對象 ...
  • 一、import 1.import語句用來完成導入其他類,同一個包下的類不需要再導入 不在同一個包下需要手動導入。 2.import語法格式 import 類名; import 包名.*; //import語句需要編寫到package語句之下,class語句之上。 3.java.lang.*;不需要 ...
  • 題目鏈接:http://codeforces.com/problemset/problem/939/A A題 A. Love Triangle time limit per test 1 second memory limit per test 256 megabytes input standar ...
  • 下載Microsoft JDBC Driver 4.0 for SQL Server 在這裡下載:http://www.microsoft.com/zh-cn/download/details.aspx?id=11774 1. 在E盤新建一個文件夾,命名為sqljdbc42,將sqljdbc42.j ...
  • 'Specifying a namespace in include() without providing an app_name ’ 從include()函數可以看出來,這個函數有兩個參數,一個arg,一個namespace,我在代碼中也是兩個參數,但是異常中提示了,沒有提供app_name,還 ...
  • Go沒有像Java那樣的異常機制,它不能拋出異常,而是使用了 panic和recover機制。一定要記住,應當把它作為最後的手段來使用,也就是說,我們的代碼中應當沒有,或者很少有panic這樣的東西。 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...