简单数据结构与算法题:猴子取桃
猴子吃桃子问题 大数据结构课程设计

标准文档目录1、需求分析 (1)2、概要设计 (1)2.1.用数组数据结构实现上述求解 (1)2.2.用链数据结构实现上述求解 (1)2.3 用栈数据结构实现求解 (1)2.4 用递归实现上述求解 (2)3、运行环境 (2)3.1 硬件环境 (2)3.2软件环境 (2)4、详细设计 (2)4.1系统流程图 (2)4.2用数组数据结构实现上述求解 (3)4.3用链数据结构实现上述求解 (4)4.4用栈数据结构实现求解 (5)4.5用递归实现上述求解 (6)5、调试分析 (7)6、运行结果 (7)课程设计总结 (8)参考文献 (9)附录: (9)1、需求分析1、猴子吃桃子问题有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
要求:1) 采用数组数据结构实现上述求解2) 采用链数据结构实现上述求解3) 采用栈实现上述求解4) 采用递归实现上述求解2、概要设计2.1.用数组数据结构实现上述求解在taozi函数中定义一个一维数组,分别存储每天的桃子个数,根据题目的内容找出各个数之间的关系,用数组元素表示出来,根据用户输入要计算哪一天的桃子,用for循环控制结束。
在main函数中让用户输入要计算的哪一天,调用taozi 函数,以便用户可查出任意一天的桃子个数,用switch语句判断用户要执行的功能,然后用while循环控制,直到用户输入0为止。
2.2.用链数据结构实现上述求解先写出预定义常量和类型,写出结点的类型定义,创建结点,初始化链表,定义变量并初始化,找出结点与其后继结点之间的联系,然后在主函数中控制。
2.3 用栈数据结构实现求解本部分包括预定义常量和类型,顺序栈的定义,InitStack函数,Push函数,和main函数,在InitStack函数构造一个空栈,在Push函数中调用该函数,并在其中编写控制栈顶指针和栈底指针移动的语句,找出指针所指向的数据之间的关系,在main函数中编写控制循环结束的语句,最后再用main函数去调用Push函数。
猴子分桃问题

实验报告
感觉这个程序边界要考虑的很好不然会出错。
但是改程序对于较大的数,运行时间比较长,这个还有待优化该程序。
实验报告说明
实验名称要用最简练的语言反映实验的内容。
如验证某程序、定律、算法,可写成“验证×××”;分析×××。
实验目的目的要明确,要抓住重点,可以从理论和实践两个方面考虑。
在理论上,验证定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的技能技巧和程序的调试方法。
一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。
实验环境实验用的软硬件环境(配置)。
实验内容(算法、程序、步骤和方法)这是实验报告极其重要的内容。
这部分要写明依据何种原理、定律算法、或操作方法进行实验,要写明经过哪几个步骤。
还应该画出流程图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明,又能使实验报告简明扼要,清楚明白。
数据记录和计算指从实验中测出的数据以及计算结果。
结论(结果)即根据实验过程中所见到的现象和测得的数据,作出结论。
小结对本次实验的体会、思考和建议。
备注或说明可写上实验成功或失败的原因,实验后的心得体会、建议等。
注意:
∙实验报告将记入实验成绩;
∙每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。
猴子摘桃问题c语言实现

计算海滩上原有桃子多少个
海滩上有一堆桃子,m只猴子来分。
第一只猴子把这堆桃子平均分为m份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
第二只猴子把剩下的桃子又平均分成m份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只、第m只猴子都是这样做的,问海滩上原来最少有多少个桃子?
输入: 输入猴子个数m(3<=m<=9)
输出: 原来最少有多少个桃子
样例输入: 3
样例输出: 25
#include <stdio.h>
int monkey( int m);
void main()
{
int m;
scanf_s("%d",&m);
printf("%d",monkey(m));
}
int monkey( int m)
{
int i=0,p,num,tmp=m;
for(num=24;;num++)
{
p = num;
while(tmp )
{
if(num%m == 1)
{
num = num -num/m -1;
}
else
{
num = p;
tmp = m;
break;
}
tmp--;
if(tmp == 0)
return p;
}
}
}。
猴子吃桃问题(C++)

s s = s − ( + 1), 将此式转化为s = 2 s + 2 2
i i +1 i i i +1
则有:
s = 1(i = 30) s = 2 s + 2(1 ≤ i<30)
i i i +1
此时由于最后一天(第 30 天的)桃子总数是已知的,根据 上述公式可推出第 29 天的桃子总数; 而根据第 29 天的又可以推 出第 28 天的桃子总数,……,重复上述工作,就可以推出第 1 天的桃子总数。推导过程如下图:
i
i +1
s =s
i +1
i
3) 输出s 的值,即为所求结果。
1
相应程序如下: #include <stdio.h> #include <stdlib.h> #define N 30 void main() { int i,si,s; s=1;//第 30 天桃子总数为 1 个
for(i=N-1;i>=1;i--) { si=2*s+2; s=si; printf("第%2d 天的桃子总数为%d 个\n",i,s); } printf("\n 共%d 天,第一天的桃子总数为%d\n",N,si); system("pause");
}
天数 i 30 29 28 ... ... 1
第 i 天桃子未吃前总数 si
s =1
30
s = 2× s ) 2 = 4 ( +
29 30
s = 2 × s ) 2 = 10 ( +
2应算法流程如下:
1) s = 1,即最初的s 为1
30 i +1
数据结构实现猴子吃桃

《数据结构》课程设计报告(猴子吃桃)学院:东方科技学院班级:08级信息工程1班学号:200841919116姓名:朱旭指导教师:贺细平老师目录一、题目概要 (1)二、基本概念和要点 (1)三、举例分析 (3)四、设计分析 (10)五、运行结果 (10)六、总结体会 (11)课程论文题目学生:朱旭(东方科技学院08级信息工程一班,学号200841919116)一、题目概要实现课题——猴子吃桃摘要:猴子吃桃这一典型的数学课题,其主要实现的过程是将其数学课题公式化,用一些简单的数据定义、初使化、通过一系列的条件判断和循环用来实现学数公式的计算机化。
通过C语言基础分析和数据结构初步了解,我们使用C语言,利用C和数据结构的结合使用,让我们在短时间内建立起对数据结构的进一步认识。
然后,形成正确的对算法和优有个的理解观念。
关键词:C语言的基本了解,数据结构的基本了解, 数据中数组的使用,用C语言实现数据链表题目有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
要求 1>链数据结构实现上述求解2>数组数据结构实现上述求解3>递归实现上述求解二、基本概念和要点数据结构的逻辑结构、存储结构及数据运算的含义及其相互关系。
数据结构的两大类逻辑结构和四种常用的存储表示方法。
数据就是指能够被计算机识别、存储和加工处理的信息的载体。
数据元素是数据的基本单位,有时一个数据元素可以由若干个数据项组成。
数据项是具有独立含义的最小标识单位。
如整数这个集合中,10这个数就可称是一个数据元素.又比如在一个数据库(关系式数据库)中,一个记录可称为一个数据元素,而这个元素中的某一字段就是一个数据项。
数据结构的定义虽然没有标准,但是它包括以下三方面内容:逻辑结构、存储结构、和对数据的操作。
这一段比较重要,用自己的语言来说就比如一个表 ( 数据库 ),我们就称它为一个数据结构,它由很多记录 ( 数据元素 )组成,每个元素又包括很多字 ( 数据项 )组成。
计算机程序设计c第6周编程作业

.计算机程序设计(c++)第6周编程作业1递归猴子摘桃(20分)题目内容:猴子摘桃:一天,一只猴子摘了若干桃子,当天吃掉一半,觉得不过瘾,又吃了一个;第二天将剩下的桃子吃掉一半又多吃了一个;…,每天将前一天剩下的桃子吃掉一半又多吃一个,直到第n天,发现只剩下一个桃子,问第一天它摘了多少桃子。
编写递归函数,计算第一天猴子摘的桃子的数量。
在主函数中输入n,调用函数计算第一天摘的桃子的数量,在主函数中输出。
输入:剩下一只桃子的天数n,n>=1。
输出:第一天摘的桃子数量。
【提示】函数格式:int monkeyandPeak(int k,int n),其中n是1只桃子的天数,k是求哪天的桃子数,返回是第k 天的桃子数。
主函数的调用格式:count= monkeyandPeak(1,n); //第n天只剩1只桃,求第1天的桃子数【注意】使用递归实现。
样例1输入:10样例1输出:1534#include<stdio.h># include <iostream>using namespace std;int peach(int n)//第N天只剩下一个桃子了{if(n==1)return 1;return 2*(peach(n-1)+1);}int main(){int a;cin>>a;printf(%d\n,peach(a));return 0;}9/ 1.2编写内联函数求矩形的面积和周长(20分)题目内容:编写函数求矩形的面积和周长,由于算式非常简单,请使用内联函数方式编写,提高程序运行效率输入格式:矩形的长和宽,均为整数输出格式:矩形的面积和周长输入样例:3 5输出样例:15 16# include <iostream>using namespace std;inline int GetSize(int a, int b){int size = a*b;return size;}inline int GetPerimeter(int a, int b){int perimeter = 2*(a+b);return perimeter;}int main(){//---define---int a,b;//---input---cin>>a;cin>>b;//---execute---//---output---cout<<GetSize(a,b)<< ;cout<<GetPerimeter(a,b)<<endl;return 0;}9/ 2.3编写重载函数显示字符串(20分)题目内容:编写函数print_spaced 显示字符串,要求显示出的字符串每个字母之间都有一个空格。
python猴子吃桃问题,数学解法
python猴子吃桃问题,数学解法猴子吃桃问题是数学中的一个经典问题,它的原型是:一只猴子在一个月圆之夜爬上一棵桃子树,树上共有n个桃子。
猴子每天吃掉一个桃子并往上爬1节树枝。
猴子第yi天只能爬上1节树枝,第二天可以爬上2节树枝,依此类推。
但是,猴子在每个月圆之夜都要回到地面开始吃桃子。
请问猴子多久才能吃到第n 个桃子?这个问题的数学解法可以用递归或动态规划的方法来解决。
下面我们将使用递归的方法来解决这个问题。
首先,我们需要定义一个函数来表示猴子的爬树过程。
这个函数接受两个参数:当前桃子数量n和当前夜晚数k。
函数返回猴子在第k个夜晚吃到第n个桃子的概率。
```pythondef monkey_probability(n, k):# 基本情况:当桃子数量为1时,猴子在第yi个夜晚就能吃到桃子if n == 1:return 1# 基本情况:当夜晚数为0时,猴子还无法吃到桃子if k == 0:return 0# 当桃子数量大于1时,猴子需要在夜晚k-1吃桃子,第k天回到地面吃桃子,所以概率为(n-1)/(k-1)else:return (n - 1) / (k - 1)```接下来,我们需要定义一个函数来计算猴子吃到第n个桃子的最有可能的晚上。
这个函数接受一个参数:桃子数量n。
```pythondef find_most_probable(n):# 初始化夜晚数和概率列表k = 1probabilities = [monkey_probability(n, i) for i in range(1, n)]# 使用动态规划计算概率列表的最大值和对应的夜晚数while k <= n:max_probability = max(probabilities)max_probability_index = probabilities.index(max_probability)probabilities[max_probability_index] = 0k += 1return k - 1```现在我们可以测试一下这个算法的准确性。
C语言猴子分桃算法
C语言猴子分桃算法猴子分桃算法是一种经典的问题,常用于测试递归和数学推理的能力。
该问题的描述为:有一堆桃子,N个猴子来分。
第一个猴子将这堆桃子平均分为等份,多出一个桃子,这只猴子将多出的桃子扔掉,然后拿走了自己的一份。
接下来,第二个猴子将剩下的桃子平均分为等份,再次多出一个桃子,扔掉后拿走了自己的一份,依此类推,直到第N个猴子拿走自己的一份。
问原来最少有多少个桃子。
这个问题可以通过递归和数学推理两种方式来解决。
1.递归解法假设原来有x个桃子,则第一个猴子拿走自己的一份后剩余(x-1)份,第二个猴子拿走自己的一份后剩余[(x-1)/(N-1)]份,第三个猴子拿走自己的一份后剩余[(x-1)/(N-1)]/[(N-1)]份,依此类推,第N个猴子拿走自己的一份后剩余1份。
我们可以建立递归函数来求解剩余桃子的数量:int peach(int N)if (N == 1)return 1;} elsereturn (peach(N-1) + 1) * N;}这里,递归步骤的关键在于每个猴子拿走自己份额后,桃子的数量变成了原来的[(x-1)/(N-1)]倍,加上1是因为剩余的一份要留给下一个猴子。
当N为1时,也就是只有一个猴子时,剩余的桃子数量就是12.数学推理解法通过数学推理,我们也可以求解原来有多少个桃子。
我们可以按照逆向的方式来推导。
假设最后一个猴子拿走自己的一份后剩余的桃子数量为1,那么上一个猴子拿走自己的一份前剩余的桃子数量可以表示为[(1+1)*N],在第二个猴子拿走自己的一份前剩余的桃子数量可以表示为[((1+1)*N+1)*N],依此类推,第一个猴子拿走自己的一份前剩余的桃子数量可以表示为[((((1+1)*N+1)*N+1)*N+1)*N]。
这个过程可以用一个循环来表示,其中x表示最后剩余的桃子数量。
int peach(int N)int x = 1;for (int i = 1; i < N; i++)x=(x+1)*N;}return x;这样,无论是递归解法还是数学推理解法,都能求解出猴子分桃问题的答案。
数据结构猴子吃桃
目录1 问题描述 (1)2 需求分析 (1)3 概要设计 (1)3.1抽象数据类型定义 (1)3.2模块划分 (2)4 详细设计 (3)4.1数据类型的定义 (3)4.2主要模块的算法描述 (3)5 测试分析 (6)6 课程设计总结 (7)参考文献 (8)附录(源程序清单) (9)1 问题描述有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子,求原来这群猴子共摘了多少个桃子。
一种采用数组数据结构实现;一种采用栈链数据结构实现;一种采用递归实现上述求解。
2 需求分析(1)由问题可知,题目中知道第十天所剩的桃子数,所以可以及往前算,算出前一天所剩余的桃子数,到第一天时即为总的桃子数,所以可用数组来存每天所剩的桃子数,容易实现求解。
(2)根据问题设第n天的桃子数为f(n),则前一天的桃子数为f(n+1)=f(n)-(f(n)/2+1),化解可得f(n)=2f(n+1)+2,以此为依据实现递归。
(3)由栈与递归的实现可知调用函数各被调用函数之间的链接及信息交换是通过栈来实现的,因此可以用栈模拟函数递归。
即可通过用栈的链表储存结构模拟函数的递归调用过程来实现问题的求解。
3 概要设计3.1抽象数据类型定义栈的抽象数据类型定义AST Stack{数据对象:D={ai|ai∈ElemSet,i=1,2,...,n, n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}约定an端为栈顶,a1端为栈底。
基本操作:InitStack(&S)操作结果:构造一个空栈S。
DestroyStack(&S)初始条件:栈S已存在。
操作结果:栈S被销毁。
ClearStack(&S)初始条件:栈S已存在。
操作结果:将栈S清为空栈。
StackEmpty(S)初始条件:栈S已存在。
操作结果:若栈S为空栈,则返回TRUE,否则FALSE。
数据结构猴子吃桃子问题
猴子吃桃子问题(1)需求分析:猴子每天都吃当前桃子的一半且再多吃一个,假设第一天开始时,即摘的桃子总数有a0只桃子,第一天吃过之后剩下a1只桃子,第二天吃过之后剩下a2只,. . .,第9天吃过之后剩下a9只,第10天吃过之后剩下a10只,在a0,a1,a2,. . .,a1 0中,只有a10= 1是知道的,现要求a0,a9= 2 * ( a1 0+ 1 )a8= 2 * ( a9+ 1 )┇a1= 2 * ( a2+ 1 )a0= 2 * ( a1+ 1 )也就是:ai= 2 * ( ai + 1),其中i=10,9,8,7,6,...,1,0(2)概要设计:采用数组和递归方法,不管是采用哪种方法、哪种数据结构,其基本语句都是ai= 2 * ( ai + 1+1),其中i=10,9,8,7,6,...,1,0(3)详细设计:采用数组数据结构:构建子函数void Array(int a[]),初始化i=10,从10开始计算,i--,通过语句while(i>0),来循环运行a[i-1]=2*a[i]+2,以求出每天剩下的桃子数当i<=1时退出循环。
在主函数中定义数组int a[11]来存储每天剩下的桃子总数,初始化a[10] =1,通过调用子函数Array(a),并利用for循环来输出每天剩下的桃子总数,其中a[0]即为原来猴群所摘的桃子的总数。
void Array(int a[]){int i=10;while(i>0){a[i-1]=2*a[i]+2;i--;}}采用递归算法:子函数中,关键语句为N=2*recursion(N+1)+2,采用判断语句 if…else…,“if(N==10) return 1;”,给出第十天吃过桃子后剩下桃子数为1,其他天数return N=2*recursion(N+1)+2,即通过递归调用计算,通过已知的后一天剩下的桃子总数来求出前一天剩下的桃子总数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:
动物园里的N只猴子编号1,2,3,….,N,N只猴子排好队,队首的猴子可以到筐子里取桃子。
当筐里为空时管理员便放入筐中一些桃子,第K次放入K个桃子。
队首猴子取桃子的规则为:若猴子手中的桃子加上框中的桃子不足m个,就把筐中的桃子全部取走,并到队尾继续排队;如果满m个,猴子取足m个桃子,并且离队。
筐里剩下的桃子由剩下的一位来取。
对于用户输入的任意N值,计算并输出N个猴子的离队序列。
数据结构使用:队列
代码:
#include <stdlib.h>
#include<stdio.h>
#define N 10 //10只猴子
#define M 20 //m的值
struct monkey
{
int id; //猴子的编号
int tao; //猴子手上的桃
};
struct queue
{
struct monkey content[N]; //队列节点:struct monkey
struct monkey* head;
struct monkey* tail;
int length;
};
int queue_init(struct queue** q) //队列初始化
{
(*q) = (struct queue*)malloc(sizeof(struct queue));
(*q)->head = &(*q)->content[0];
(*q)->tail = &(*q)->content[0];
(*q)->length = 0;
return 0;
}
int queue_in(struct queue* q,struct monkey in) //入队列
{
if(q->length == 0)
{
*(q->tail) = in;
q->length++;
}
else
{
q->tail++;
*(q->tail) = in;
q->length++;
}
return 0;
}
int queue_out(struct queue* q, struct monkey* out) //出队列{
int i = 0;
*(out) = *(q->head);
for(;i < q->length-1;i++)
q->content[i] = q->content[i+1];
q->tail--;
q->length--;
return 0;
}
//队首到队尾
int queue_a(struct queue* q) //队首换到队尾
{
struct monkey temp;
queue_out(q, &temp); //取队首
queue_in(q,temp); //入队尾
return 0;
}
int main()
{
struct monkey data[N];
struct queue* q = NULL;
struct monkey temp;
int i;
int kuang = 0;
for(i=0;i<N;i++)
{
data[i].id = i+1;
data[i].tao = 0;
}
queue_init(&q);
for(i=0;i<N;i++)
queue_in(q, data[i]);
for(i=0;i<N;i++)
{
printf("%d\t%d\n",q->content[i].id,q->content[i].tao);
}
printf("leng=%d\n",q->length);
printf("head %d\t tail %d\n",q->head->id,q->tail->id);
i = 0;
/* 算法主流程 */
while(q->length != 0) //队列不空
{
if(kuang == 0) //框里没桃,放桃
{
i++;
kuang += i;
}
//队首猴取桃
if(q->head->tao + kuang < M) //拿完框里的不足m个
{
q->head->tao += kuang;
kuang = 0;
queue_a(q); //换到队尾
}
else
{
/* 拿完框里的够 m个*/
kuang -= M - q->head->tao;
q->head->tao += M - q->head->tao;
queue_out(q, &temp); //出队列
printf("%d\t%d\n",temp.id,temp.tao);
}
}
return 0;
}。