最近找工作頭疼沒事就開始琢磨python解應用題應該可以,順便還可以整理下思路當然下面的解法只是個人理解,也歡迎大佬們給意見或者指點更好的解決辦法等於優化代碼了嘛,也歡迎大家出點小題目做也可以,如果可以我也會定期專門來做應用題(你弟弟或者你表弟或者外甥等來問應用題在也不用算了,把思路和答案給他讓他自己一邊研究去。)好了先來看如下題目:
55名學生圍成一個圓圈站好,並按照順時針的方向依次編號1~55。然後1開始報數,隔一個人3號繼續報數,接著是5號,7號……每一輪中,沒有報數的同學都走出隊伍,知道剩下最後一個人。請問最後一個站在隊伍中的人是幾號?
首先來聊聊題目中的信息提取也就是程序已知的參數,55個學生可以當一個列表,報數是1,3,5,7隔著報數,偶數位的都被排除,一輪排除後剩下的等於是接到前面列表結束位置的數55繼續排除,這裡要提醒前面的55這時候就是剩下的第一位,那麼數字1就是第二位,等於我們要把每次循環的第一位給排除掉,才能無縫銜接,只要能理解這個很重要的一點這程序就通了。話不多說上代碼了:
#!/usr/bin/env python # -*- coding:utf-8 -*- students = [x for x in range(1,56)] #生成學生1到55個學生列表 print students #打印出來後面對比 def leave(team): #定義函數,因為題目剩下的學生還要繼續所以用遞歸的方式 spare = [] #臨時創庫用於存放每次報數後剩下的學生 if len(team)>1: #判斷這個隊列的長度不能小於1避免無限遞歸 for i in range(len(team)+1): #記住這裡要的是列表的下標偶數而不是數字偶數(留給你們自己思考) if i==1: #重點中的重點無縫連接55後面下次循環1等於2的位置所以直接排除 continue if i%2==0: #隊列中偶數下標的人也就是1,3,5中間的2,4排除掉 continue else: #前面排除後剩下的學生存放到臨時倉庫 spare.append(team[i-1]) print spare #打印後面銜接的剩下學生 if len(spare)>2: #判斷到最後只要兩位就是接可以得出結果(由於上面第一位就直接排除的原因) leave(spare) #迭代函數再次排除偶數位置的學生 else: print spare[1] #最後剩下兩個人時其實第一個人就直接排除剩下就是最後一個報數的人 else: print "Who lies!!!" #如果沒人就打印誰亂報數 leave(students)
程序思路是:首先要循環接力報數,然戶要遞減人數我這裡就用遞歸的方法,需要遞減偶數位置,我這裡用列表下標方式對應位置(偶數出列),然後限定條件,就是找到剩余幾個人結束,由於每次第一個人直接排除所以到剩下兩個人時排除第一個位置後就是答案。下面是結果:
有一個監獄犯人吃飯時,如果3個人坐一桌則余2人,5個人坐一桌則余4,7個人坐一桌則余6人,9個人坐一桌則余8人,11個人坐一桌正好坐滿,問一共有多少犯人?
還是來先提取題目中的參數信息,如果關鍵字可以看成程序中的條件if對待,總數X%3=2,X%5=4.......X%9=8..X%11=0,其實這寫都是條件,注意的是犯人的總數是要同時滿足這幾個條件,而不是滿足其中一個。是不是思路很清晰了我們可以用程序的and方法就是條件全滿足時執行。來看看代碼:
#!/usr/bin/env python # -*- coding:utf-8 -*- ''' 1,首先我們不知道這個數,所以可以用X未知數來表示 2,估計一個范圍,因為這個數字不是唯一的,答案也不是唯一的除非是選擇題目 3,我會用兩種寫法來解答,各位自己取捨理解好用就行。 ''' for x in range(10000): if x%3==2 and x%5==4 and x%7==6 and x%9==8 and x%11==0: print x, print print [x for x in range(10000) if x%3==2 and x%5==4 and x%7==6 and x%9==8 and x%11==0]
是不是很簡單只用把條件放去循環內部,程序會自己判斷取值,這裡我定義的范圍是1萬內滿足條件的輸出,上面常用的for循環寫法,下面就是列表解析式,大家覺得那種好理解就用哪種吧!!!來看結果如下(有3個數滿足條件):
兩火車相距10千米,A火車每小時1千米速度前行,B火車每小時2千米速度前行,求B幾小時後追上A?
首先參數是A的長度是10千米,B為0千米,然後計算小時用一個計數器初始為0,然後要用到循環A每次加1千米,B每次加2千米,計數器來計算循環次數也就是幾小時後追上A火車。代碼如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- A = [] for i in range(10): #初始化一個A已經跑了個距離 A.append("1") #用1表示每小時走了1千米 print A #打印一個原始數據 print "--------------分割線-------------------" B = [] #初始化B列車 count = 0 #小時計數器統計用了幾小時 for h in range(100): #估計范圍 if len(A)!=len(B): #當A走的范圍不等於B走的范圍時 A.append("1") #A每次走1千米 B.append("2") #B每次走2千米走了兩次 B.append("2") count+=1 #每次執行就代表用了一小時所以要加上 elif len(A)==len(B): #當A走的距離等於B走的距離時 print "追上了A" #提醒已經追上A break #退出循環 print A #每次打印走的距離 print B #同上 print "B追上A花了%d小時"%count
基本都在注釋上面,很容易理解,是不是覺得很有趣,用python來做應用題鍛煉思路很好的方法,可以鍛煉對問題的分析及處理過程。
好了最後還是感謝觀看,下次再見!!!
Ubuntu 14.04安裝Python 3.3.5 http://www.linuxidc.com/Linux/2014-05/101481.htm
CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm
在CentOS 6.5上安裝Python2.7 http://www.linuxidc.com/Linux/2016-10/136206.htm