《算法设计与分析报告》趣味题Word下载.docx
- 文档编号:15860317
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:15
- 大小:132.42KB
《算法设计与分析报告》趣味题Word下载.docx
《《算法设计与分析报告》趣味题Word下载.docx》由会员分享,可在线阅读,更多相关《《算法设计与分析报告》趣味题Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
1.实验前复习课程所学知识以及阅读和理解指定的课外阅读材料;
2.学生独自完成实验指定内容;
3.实验结束后,用统一的实验报告模板编写实验报告。
4.提交说明:
(1)电子版提交说明:
a需要提交Winrar压缩包,文件名为“《算法设计与分析》实验一_学号_姓名”,
如“《算法设计与分析》实验一_09290101_张三”。
b压缩包内为一个“《算法设计与分析》实验一_学号_姓名”命名的顶层文件夹,
其下为两个文件夹,一个文件夹命名为“源程序”,另一个文件夹命名为“实验
报告电子版”。
其下分别放置对应实验成果物。
(2)打印版提交说明:
a不可随意更改模板样式。
b字体:
中文为宋体,大小为10号字,英文为TimeNewRoman,大小为10号
字。
c行间距:
单倍行距。
(3)提交截止时间:
2012年10月31日16:
00。
三、实验项目
1.运用递归策略设计算法实现下述题目的求解过程。
题目列表如下:
(1)运动会开了N天,一共发出金牌M枚。
第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。
到了第N天刚好还有金牌N枚,到此金牌全部发完。
编程求N和M。
(2)国王分财产。
某国王临终前给儿子们分财产。
他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;
给第二个儿子两份,再加上剩余财产的1/10;
……;
给第i个儿子i份,再加上剩余财产的1/10。
每个儿子都窃窃自喜。
以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。
请用程序回答,老国王共有几个儿子?
财产共分成了多少份?
(3)出售金鱼问题:
第一次卖出全部金鱼的一半加二分之一条金鱼;
第二次卖出乘余金鱼的三分之一加三分之一条金鱼;
第三次卖出剩余金鱼的四分之一加四分之一条金鱼;
第四次卖出剩余金鱼的五分之一加五分之一条金鱼;
现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。
问这鱼缸里原有多少条金鱼?
(4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;
到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?
(5)猴子吃桃。
有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?
(6)小华读书。
第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少钱页?
(7)日本著名数学游戏专家中村义作教授提出这样一个问题:
父亲将2520个桔子分给六个儿子。
分完后父亲说:
“老大将分给你的桔子的1/8给老二;
老二拿到后连同原先的桔子分1/7给老三;
老三拿到后连同原先的桔子分1/6给老四;
老四拿到后连同原先的桔子分1/5给老五;
老五拿到后连同原先的桔子分1/4给老六;
老六拿到后连同原先的桔子分1/3给老大”。
结果大家手中的桔子正好一样多。
问六兄弟原来手中各有多少桔子?
四、实验过程
(一)题目一:
运动会开了N天,一共发出金牌M枚。
1.题目分析
分析此题,可以按照从第一天开始递归,每次和前一天的金牌剩余数的关系为:
(前一天金牌剩余数-当天为第几天)*6/7=当天金牌剩余数,递归终点为:
当某一天的前一天的金牌剩余数等于当天的天数,即为终止点。
2.算法构造
通过双重循环来寻找天数和金牌数,构造一个存放每天剩余金牌数的容器,我使用的是java语言,选择了LinkedList,在构造递归关系时候,主要要判断该天金牌数-天数之差是否能是7的倍数,如果不能,则设置为0,在后面的条件判断时候予以舍弃情况。
3.算法实现
importjava.util.LinkedList;
publicclassWork1{
/**
*@authorWz
*/
/*
*题目要求:
第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,
*第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。
到了第N天刚好还有金牌N枚,到此金牌全部发完。
publicstaticvoidmain(String[]args){
LinkedList<
Integer>
lt=newLinkedList<
();
for(intn=3;
n<
10;
n++){//逐次循环查找天数
for(intm=1;
m<
50;
m++){//逐次递增寻找金牌枚数
lt.add(0,m);
//一共m枚
//第n天剩下n枚
for(inti=1;
i<
=n;
i++){
lt.add(i,giveout(lt.get(i-1),i));
}
if(lt.get(n-1)-n==0){
System.out.println("
金牌数:
"
+lt.get(0)+"
天数:
+n);
}
}
}
publicstaticintgiveout(intcount,intnowday){//分发金牌
if((count-nowday)%7!
=0)
return0;
else
return(count-nowday)*6/7;
}
4.运行结果
5.经验归纳
算法设计时,注意逻辑性的严谨,考虑情况要全面,条件判断位置要适宜。
(二)题目二:
国王分财产。
通过双重循环寻找儿子个数和份数,然后通过构造递归关系从而寻找到结果。
通过一个linkedlist保存每次分后的剩余财产,在递归最后如果最后剩余财产为0,且最后一个儿子正好得到n份,则该循环的结果为提目要求的结果
publicclassWork2{
*国王分财产。
他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;
*给第二个儿子两份,再加上剩余财产的1/10;
给第i个儿子i份,再加上剩余财产的1/10。
*每个儿子都窃窃自喜。
请用程序回答,老国王共有几个儿子?
for(intn=4;
100;
n++){//循环设置份数
for(intm=2;
m++){//设置儿子个数
lt.add(0,n);
//一共为1
=m;
lt.add(i,giveout(i,lt.get(i-1),n));
//分给第i个儿子后剩下的财产为
if(lt.get(m)==0&
&
lt.get(m-1)==m){
一共分了"
+n+"
份,国王有:
+m+"
个儿子"
);
}else{
lt.clear();
publicstaticintgiveout(intindex,intleft,intn){//分财产
if((left-index)%10!
return9*(left-index)/10;
(三)题目三:
出售金鱼问题:
通过循环设置条数,然后通过构造递归关系从而寻找到结果。
通过递归,从最后11条金鱼开始逐次向前一天寻找。
publicclassWork3{
*出售金鱼问题:
*第四次卖出剩余金鱼的五分之一加五分之一条金鱼;
lt.add(0,11);
//剩余11条
//第n天原有x条
inttemp=4;
for(inti=1;
=4;
lt.add(preday(temp,lt.get(i-1)));
temp--;
System.out.println("
鱼缸里原来有:
+lt.get(4)+"
条金鱼"
publicstaticintpreday(intindex,intleft){//计算前一天的条数
return(left*(index+1)+1)/index;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法设计与分析报告 算法 设计 分析 报告 趣味