转载链接: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源码】

 #!/usr/bin/python
#coding=utf-8
# __author__ = 'cy'
#输入猴子数量
monkey = input("Input monkey num:")
#定义桃子总数函数
def show(n):
#循环次数
for i in xrange(1, monkey+1):
#下一只猴子应该带走的桃子数
t = (n - 1) / monkey
#格式化输出
print u'%d. 桃子有%d个, 第%i只猴吃1个, 拿走%s个。' % (i, n, i, t)
#前一只猴子带走一份桃子后剩余的桃子总数
n = (monkey-1) * t
#定义功能函数
def fun():
#从1开始
k = 1
while True:
t = k
#循环次数
for i in xrange(monkey-1):
#当前猴子应拿走桃子数为tc,吃拿之前总量应为 monkey * tc + 1,前一个猴子拿走桃子数为tp,则有 (monkey-1) * tp = monkey * tc + 1
t = monkey * t + 1
#在for循环中含有break时则直接终止循环,不执行else
if t % (monkey-1): break
t /= (monkey-1)
#当迭代的对象迭代完并为空时,位于else的子句将执行,即找到符合条件最小整数
else:
print u'如果猴子%d只:'% monkey
print u'桃子总数要%d个:'% (monkey * t + 1)
show(monkey * t + 1)
break
k += 1
fun()

用python实现【五猴分桃】问题的更多相关文章

  1. Java50道经典习题-程序41 猴子分桃

    题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿 ...

  2. Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  3. 简学Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  4. Python进阶(五)----内置函数Ⅱ 和 闭包

    Python进阶(五)----内置函数Ⅱ 和 闭包 一丶内置函数Ⅱ ####内置函数#### 特别重要,反复练习 ###print() 打印输入 #sep 设定分隔符 # end 默认是换行可以打印到 ...

  5. JAVA 基础编程练习题41 【程序 41 猴子分桃】

    41 [程序 41 猴子分桃] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...

  6. java例题_41 利用递归给猴子分桃

    1 /*41 [程序 41 猴子分桃] 2 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把 3 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均 ...

  7. Python(五)编程小实例

    Python(五)编程小实例 抓取网页信息,并生成txt文件内容! Python抓取网页技能--Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些 ...

  8. 初学Python(五)——元组

    初学Python(五)——元组 初学Python,主要整理一些学习到的知识点,这次是元组. #-*- coding:utf-8 -*- #定义元素 t = (1,2,3) #添加元素 #删除元素 #更 ...

  9. Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块

    Python第五天   文件访问    for循环访问文件    while循环访问文件   字符串的startswith函数和split函数  linecache模块 目录 Pycharm使用技巧( ...

随机推荐

  1. JavaSE集合基础总览

    Java集合 Java集合,也称之为容器.基本上你写所有的Java程序,都必须要用到一个包.该API基本都位于java.util工具类包中,是JavaSE中的重中之重.简单可以总结为“1136”,分别 ...

  2. Eclipse reference

    http://download.csdn.net/download/ling_min/4318719 http://www.qualityeclipse.com/eclipse-gef http:// ...

  3. C++ Knowledge series overloading

    What does the compiler behind our programming? Overloading in C++ Override all of overloaded functio ...

  4. 【Node.js】初识Node.js

    因组里项目需要,我和另外一名同事要学习Node.js.之前接触过Javascript,都是前台处理html时用到,现在要用Javascript做后端,学习Node.js,用一段时间专心学习一门新技术, ...

  5. ansible使用9-Playbooks: Special Topics

    Accelerated Mode port 5099 持续连接30min --- - hosts: all accelerate: true tasks: - name: some task comm ...

  6. mybatis返回boolean值时数据库返回null

    Servlet.service() for servlet [springDispatcherServlet] in context with path [/ms] threw exception [ ...

  7. 显示、更改ubuntu linux主机名(计算机名)

    在bash中输入hostname可以显示计算机名.Linux和windows都可以使用这条指令. 主机名保存在/etc/hostname文件中 需要进入Root权限才可以修改该文件. sudo ged ...

  8. do..while(false)的用法总结

    首先要注意: do..while(0) 代表do里面的东西至少被执行一次,在这里仅仅执行一次. 此种用法有三个用处: 代替{}代码块,实现局部作用域.在某些宏定义时非常有用: #define f(x) ...

  9. 模拟猜数(POJ2328)

    题目链接:http://poj.org/problem?id=2328 解题报告: 缩短区间,soeasy, #include <stdio.h> #include <stdlib. ...

  10. 模拟插队,出队,POJ(2259)

    题目链接:http://poj.org/problem?id=2259 水题一个,就是要记录一下每个队列是否有人bool[i], #include <iostream> #include ...