Python來做應用題及思路 最近找工作頭疼沒事就開始琢磨python解應用題應該可以,順便還可以整理下思路當然下麵的解法只是個人理解,也歡迎大佬們給意見或者指點更好的解決辦法等於優化代碼了嘛,也歡迎大家出點小題目做也可以,如果可以我也會定期專門來做應用題(你弟弟或者你表弟或者外甥等來問應用題在也不 ...
Python來做應用題及思路
最近找工作頭疼沒事就開始琢磨python解應用題應該可以,順便還可以整理下思路當然下麵的解法只是個人理解,也歡迎大佬們給意見或者指點更好的解決辦法等於優化代碼了嘛,也歡迎大家出點小題目做也可以,如果可以我也會定期專門來做應用題(你弟弟或者你表弟或者外甥等來問應用題在也不用算了,把思路和答案給他讓他自己一邊研究去。)好了先來看如下題目:
1.firstblood題目一:
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)
程式思路是:首先要迴圈接力報數,然戶要遞減人數我這裡就用遞歸的方法,需要遞減偶數位置,我這裡用列表下標方式對應位置(偶數出列),然後限定條件,就是找到剩餘幾個人結束,由於每次第一個人直接排除所以到剩下兩個人時排除第一個位置後就是答案。下麵是結果:
2.double kill題目二
有一個監獄犯人吃飯時,如果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個數滿足條件):
3.triple kill題目三:
兩火車相距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來做應用題鍛煉思路很好的方法,可以鍛煉對問題的分析及處理過程。
好了最後還是感謝觀看,下次再見!!!