




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1979年,诺贝尔奖获得者李政道教授到中国科技大学讲学,他给少年班的同学出了这样一道算术题:有5只猴子在海边发现一堆桃子,决定第二天来平分.第二天清晨,第一只猴子最早来到,它左分右分分不开,就朝海里扔了一只,恰好可以分成5份,它拿上自己的一份走了.第2,3,4,5只猴子也遇到同样的问题,采用了同样的方法,都是扔掉一只后,恰好可以分成5份.问这堆桃子至少有多少只.据说没有一个同学能当场做出答案.怎么解? 我在小学学竞赛的时候曾遇到了这个题,当时百思不得其解。后来上高中后用递推数列解决了此题自以为很有成就感,后在一本书上看到的解法既揭示了问题的本质又异常简单。突然想起这道趣题不敢独享特与大家分享。
2、 如果借4个挑子的话。恰好每次都能平分成5份。就是说每次拿的桃子和扔了的加拿了的是一样多。设开始有x个桃子借了4个后就是(x+4)个桃子。每次就余下前次对应的4/5,借了4个桃子后等第五只猴子来过后应该余下的桃子是个 x+4必须是5的5次方的倍数所以x至少是3121,此时余下的桃子是1024个但借了的4个要还回去,实际余下的是1020个。一道经典难题就轻松解决了,我们学习数学就是去享受思考的过程。C+ 五猴分桃5只猴子一起摘了一大堆桃子,晚上有一只猴子醒来发现其他猴子都睡着了,就起来吃了一个桃子,然后将剩余的桃子恰好平均分成份,自己拿了其中的一份藏起来,然后去睡觉第二只猴子醒来发现其他猴子都睡
3、着了,就像第一只猴一样先吃了一个桃子,然后将其它的桃子又恰好平均分成份,自已也拿了其中的一份藏起来,接着又去睡觉第三只,第四只,第五只猴都像第一第二只猴一样做了,现问:这只猴至少摘了多少个桃子?3121个*/#include "iostream.h"void main()long k,houzi=1,i=4,m_find=0;float n;while(i<50000)n=(float)i*5/4+1;if(n=(int)n)houzi=1;while(houzi<6)k=(long)n;n=(float)k*5/4+1;if(n=(int)n)houzi+;e
4、lsebreak;if(houzi=5)m_find+;cout<<"第"<<m_find<<"次找到"<<endl;cout<<"总的桃子有"<<n<<"个"<<endl;i+;elsei+;5个猴子摘了一堆桃子,约好第二天早上来分。第一只猴子来得早,它将桃子平分成5堆,多出一个,它把多出的一个吃了,把属于自己的一堆拿走了,将剩下的还混成一堆。其他猴子来了也正好按一样的方法处理。编程求出原来有多少个桃子。(用递归函数)
5、 (用C+编写)提问者: huaxue1987 - 助理 二级最佳答案* * 答案: 3121 * * 思路一: (逆) 假设还有最后第6个猴子F,最后剩下给它的果子数为f=last(剩下的可能是f=0). 那么可知,E得到的果子数是:e=4*f(e为整数,因为果子数是整的),由这里可见: f是4的倍数!(注意这里,这是程序里f=0;f=f+4的原因!) 于是 D 分到的果子数是:d=(5*e+1)/4; 同理:c=(5*d+1)/4; b=(5*c+1)/4; a=(5*b+1)/4 ;
6、60;思路二: (正) 假设分前的果子数为fisrt,A分到的果子数为a=(first-1)/5+1,这里可见(first-1)%5=0也就是5的倍数!(因为果子数是整数) b=(4*(a-1)-1)/5+1,同理,c=(4*(b-1)-1)/5+1,d=(4*(c-1)-1)/5,e=(4*(d-1)-1)/5+1 *(到最后我们试着比较两个思路的出的程序各有什么优缺点?)* *程序本身不多-注释挺详细* C+程序实现: (逆) #include<iostream> using namespace std;
7、160;int fenyu(int e,int n) ; void main() int f,n=5,first; for(f=0;!(first=fenyu(f/4,n);f+=4) ; cout<<"first="<<first<<endl <<" last="<<f<<endl;/*输出分前和分后果子数*/ int fenyu(int e,int n) /* e:表示第n个猴子的果子数
8、; n:表示他是第n个分的,因每个猴子分到的果子是整数,所以(5*e+1)是4的倍数,故用整除*/ if(n=1) return (5*e+1); /* n=1 返回 未分前的果子数目 */ else if(5*e+1)%4=0) return fenyu(5*e+1)/4,n-1); /*递归检验前一个猴子得到的果子是不是整数*/ else return 0; /* 只要分到的果子不是整数,就返回0 */ C+程序实现:(正) #include<iostream> using namespace std;
9、160;int fenyu(int a,int n) ; void main() int f,last; for(f=1;!(last=fenyu(f/5+1,1);f+=5) ; cout<<"first="<<f<<endl <<" last="<<last<<endl;/*输出分前和分后果子数*/ int fenyu(int a,int n) /*a:表示第n个猴子的果子数; n:表示
10、他是第n个分的,因每个猴子分到的果子是整数,所以下一个猴子分前的4*(a-1)-1是5的倍数,故用整除*/ if(n=5) return 4*(a-1); /* 返回 最后剩余的果子数目 */ else if(4*(a-1)-1)%5=0) return fenyu(4*(a-1)/5+1,n+1); /*递归检验前一个猴子得到的果子是不是整数*/ else return 0; /* 只要分到的果子不是整数,就返回0 */ 现在说说,这两种相反思路,编写的不同: 顺向思路: for()中的循环是以开始的果子数为循环量,从答案来看,需要3121次循环, 但由于分配前果子量是A得到果子数的(a-1)的5倍多1个,也就是说,分配前果子量减1整除5,这样,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 材料力学与智能制造工艺重点基础知识点
- 材料疲劳裂纹扩展数据处理原理重点基础知识点
- 集合概念的实际应用试题及答案
- 常见火灾事故应急预案(3篇)
- 行政法学知识点梳理与试题及答案汇编
- 低压室火灾应急预案(3篇)
- 发展战略与市场预测的关系试题及答案
- 火灾扑灭瞬间应急预案(3篇)
- 计算机程序设计入门考试题及答案
- 2025软考网络运营管理试题及答案
- 信贷准入资格考试练习测试题附答案
- 中国农业发展史
- 2024年山东省德州市中考地理试题卷
- T∕CACE 0118-2024 改性磷石膏混合料道路稳定基层应用技术规程
- 员工投诉与申诉处理机制
- 20以内加减法口算练习题带括号填空135
- 《黑神话:悟空》IP营销全景解析
- 良好卫生规范验证记录
- 2024年安徽马鞍山中考数学试题及答案1
- DL∕T 722-2014 变压器油中溶解气体分析和判断导则
- 三级公立医院绩效考核微创手术目录(2022版)
评论
0/150
提交评论