1. 程式人生 > >用python實現【五猴分桃】問題

用python實現【五猴分桃】問題

odi 沒有 else bsp inpu 有意思 如果 循環 包括

轉載鏈接:https://blog.csdn.net/cy309173854/article/details/78296839

據說“五猴分桃”問題最先是由大物理學家狄拉克提出來的,這一貌似簡單的問題曾困擾住了他,經過努力,他只是獲得了相當繁瑣的求解方法。為了獲得簡便的方法,他把問題提供給當時的一些數學家,有意思的是竟然也沒有得到滿意的結果。在後來者的不斷努力下,比較簡捷的方法才逐步湧現。
李政道和楊振寧曾榮獲諾貝爾物理學獎,正是由李政道提議成立了中科大少年班,他在中科大少年班的開班儀式上對“五猴分桃”問題進行適當演繹,提供給了少年班同學。

【五猴分桃】

話說花果山水簾洞有5只聰明的猴子,有一天它們得到了一堆桃子,他們發現那堆桃子不能被均勻分5份,於是猴子們決定先去睡覺,明天再討論如何分配。夜深人靜的時候,猴子A偷偷起來,吃掉了一個桃子後,它發現余下的桃子正好可以平均分成5份,於是它拿走了一份;接著猴子B也起來先偷吃了一個,結果它也發現余下的桃子恰好可以被平均分成5份,於是它也拿走了一份;後面的猴子C、D、E一次如法炮制,先偷吃一個,然後將余下的桃子平均分成5份並拿走了自己的一份,問:這一堆桃子至少有幾個?

【解決思路】

設桃子總數為N,先借4個,總數則為N+4個,分成5份,每份相同。

經過第一步後,剩下4(N+4)/5

經過第二步後,剩下4^2(N+4)/5^2

經過第三步後,剩下4^3(N+4)/5^3

經過第四步後,剩下4^4(N+4)/5^4

經過第五步後,剩下4^5(N+4)/5^5

顯然,4^5(N+4)/5^5 為整數,因為4^5和5^5互質,則:(N+4)肯定能被5^5整除。

所以,N=5^5×K-4,(K=1,2,3,......) 當K=1時,N為最小值,結果為5^5-4=3121

實際上只需要往桃堆添四個桃,就會發現,實際上每次猴子都是拿走桃堆的五分之一(包括它吃掉的),然後就是一個公比為5/4的等比數列。

【Python源碼】

 1 #!/usr/bin/python
 2 #coding=utf-8
 3 # __author__ = ‘cy‘
 4 #輸入猴子數量
 5 monkey = input("Input monkey num:")
 6 #定義桃子總數函數
 7 def show(n):
 8     #循環次數
 9     for i in xrange(1, monkey+1):
10         #下一只猴子應該帶走的桃子數
11         t = (n - 1) / monkey
12         #格式化輸出
13         print u%d. 桃子有%d個, 第%i只猴吃1個, 拿走%s個。
% (i, n, i, t) 14 #前一只猴子帶走一份桃子後剩余的桃子總數 15 n = (monkey-1) * t 16 #定義功能函數 17 def fun(): 18 #從1開始 19 k = 1 20 while True: 21 t = k 22 #循環次數 23 for i in xrange(monkey-1): 24 #當前猴子應拿走桃子數為tc,吃拿之前總量應為 monkey * tc + 1,前一個猴子拿走桃子數為tp,則有 (monkey-1) * tp = monkey * tc + 1 25 t = monkey * t + 1 26 #在for循環中含有break時則直接終止循環,不執行else 27 if t % (monkey-1): break 28 t /= (monkey-1) 29 #當叠代的對象叠代完並為空時,位於else的子句將執行,即找到符合條件最小整數 30 else: 31 print u如果猴子%d只:% monkey 32 print u桃子總數要%d個:% (monkey * t + 1) 33 show(monkey * t + 1) 34 break 35 k += 1 36 fun()

用python實現【五猴分桃】問題