《算法设计与分析报告》趣味题.docx
《《算法设计与分析报告》趣味题.docx》由会员分享,可在线阅读,更多相关《《算法设计与分析报告》趣味题.docx(15页珍藏版)》请在冰豆网上搜索。
《算法设计与分析报告》趣味题
学号10770114
天津城市建设学院
《算法设计与分析》
实验报告一
学生
王哲
专业、班级
10软件1班
指导教师
唐国峰
成绩
电子与信息工程系
2012年10月10日
实验一:
递归策略运用练习
一、实验目的
本次实验是针对递归算法的算法设计及应用练习,旨在加深学生对该算法原理的理解,提高学生运用该算法解决问题的能力。
二、实验步骤与要求
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枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。
到了第N天刚好还有金牌N枚,到此金牌全部发完。
编程求N和M。
1.题目分析
分析此题,可以按照从第一天开始递归,每次和前一天的金牌剩余数的关系为:
(前一天金牌剩余数-当天为第几天)*6/7=当天金牌剩余数,递归终点为:
当某一天的前一天的金牌剩余数等于当天的天数,即为终止点。
2.算法构造
通过双重循环来寻找天数和金牌数,构造一个存放每天剩余金牌数的容器,我使用的是java语言,选择了LinkedList,在构造递归关系时候,主要要判断该天金牌数-天数之差是否能是7的倍数,如果不能,则设置为0,在后面的条件判断时候予以舍弃情况。
3.算法实现
importjava.util.LinkedList;
publicclassWork1{
/**
*authorWz
*/
/*
*题目要求:
运动会开了N天,一共发出金牌M枚。
第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,
*第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。
到了第N天刚好还有金牌N枚,到此金牌全部发完。
编程求N和M。
*/
publicstaticvoidmain(String[]args){
LinkedListlt=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.经验归纳
算法设计时,注意逻辑性的严谨,考虑情况要全面,条件判断位置要适宜。
(二)题目二:
国王分财产。
某国王临终前给儿子们分财产。
他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i个儿子i份,再加上剩余财产的1/10。
每个儿子都窃窃自喜。
以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。
请用程序回答,老国王共有几个儿子?
财产共分成了多少份?
1.题目分析
通过双重循环寻找儿子个数和份数,然后通过构造递归关系从而寻找到结果。
2.算法构造
通过一个linkedlist保存每次分后的剩余财产,在递归最后如果最后剩余财产为0,且最后一个儿子正好得到n份,则该循环的结果为提目要求的结果
3.算法实现
importjava.util.LinkedList;
publicclassWork2{
/**
*authorWz
*/
/*
*国王分财产。
某国王临终前给儿子们分财产。
他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;
*给第二个儿子两份,再加上剩余财产的1/10;给第i个儿子i份,再加上剩余财产的1/10。
*每个儿子都窃窃自喜。
以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。
请用程序回答,老国王共有几个儿子?
财产共分成了多少份?
*/
publicstaticvoidmain(String[]args){
LinkedListlt=newLinkedList();
for(intn=4;n<100;n++){//循环设置份数
for(intm=2;m<50;m++){//设置儿子个数
lt.add(0,n);//一共为1
for(inti=1;i<=m;i++){
lt.add(i,giveout(i,lt.get(i-1),n));//分给第i个儿子后剩下的财产为
}
if(lt.get(m)==0&<.get(m-1)==m){
System.out.println("一共分了"+n+"份,国王有:
"+m+"个儿子");
}else{
lt.clear();
}
}
}
}
publicstaticintgiveout(intindex,intleft,intn){//分财产
if((left-index)%10!
=0)
return0;
else
return9*(left-index)/10;
}
}
4.运行结果
5.经验归纳
(三)题目三:
出售金鱼问题:
第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。
问这鱼缸里原有多少条金鱼?
1.题目分析
通过循环设置条数,然后通过构造递归关系从而寻找到结果。
2.算法构造
通过递归,从最后11条金鱼开始逐次向前一天寻找。
3.算法实现
importjava.util.LinkedList;
publicclassWork3{
/**
*authorWz
*/
/*
*出售金鱼问题:
第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;
*第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。
问这鱼缸里原有多少条金鱼?
*/
publicstaticvoidmain(String[]args){
LinkedListlt=newLinkedList();
lt.add(0,11);//剩余11条
//第n天原有x条
inttemp=4;
for(inti=1;i<=4;i++){
lt.add(preday(temp,lt.get(i-1)));
temp--;
}
System.out.println("鱼缸里原来有:
"+lt.get(4)+"条金鱼");
}
publicstaticintpreday(intindex,intleft){//计算前一天的条数
return(left*(index+1)+1)/index;
}
}
4.运行结果
5.经