c语言经典问题-猴子问题

合集下载

c语言经典案例1

c语言经典案例1

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。

以后每天早上都吃了前一天剩下的一半零一个。

到第10天早上想再吃时,见只剩下一个桃子了。

求第一天共摘了多少。

1.程序分析:采取逆向思维的方法,从后往前推断。

2.程序源代码:main(){int day,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/x2=x1;day--;}printf("the total is %d\n",x1);}-----------------------------------------------------------------------------【程序22】题目:两个乒乓球队进行比赛,各出三人。

甲队为a,b,c三人,乙队为x,y,z三人。

已抽签决定比赛名单。

有人向队员打听比赛的名单。

a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

2.程序源代码:main(){char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/for(i='x';i<='z';i++)for(j='x';j<='z';j++){for(k='x';k<='z';k++){ if(i!=k&&j!=k){ if(i!='x'&&k!='x'&&k!='z')printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);}}}}-----------------------------------------------------------------------------【程序23】题目:打印出如下图案(菱形)****************************1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。

猴子摘桃问题c语言实现

猴子摘桃问题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语言问题关于猴子的问题

经典C语言问题关于猴子的问题
山上有 m 只猴子要选大王,选举办法如下:所有猴子从 1 到 m 进行 编号并围坐一圈 ,从第一号开始按顺序 1,2,...n 继续报数,凡是报 n 号的猴子都退出到圈外 ,照此循环报数 ,直到圈内只剩下一只猴子时 , 这只猴子就是大王.输出大王的编号。
第一种方法:利用循环链表 #include<stdio.h> #include<malloc.h> #define M 8 #define N 3 typedef struct monkey {int number; int flag; struct monkey* next; }MONKEY; main() { MONKEY *head=NULL,*p,*s; int i,sum=0,count=0; clrscr(); //清屏 //分配内存 //共有 8 只猴子 //数到 3 只时退出第三只
else
link.nextp=i+1;
link.number=i;
} printf("\n"); count=0; h=M; printf("依次退出的猴子: \n"); while(count<M-1) {i=0; while(i!=3) { h=link[h].nextp; if(link[h].number) i++;}
if(k==q) { *(p+i)=0; k=0; m++; } i++; if(i==n)i=0; } while(*p==0)p++; printf("The last one is NO:%d\n",*p); getch();
}
printf("%4d",link[h].number); link[h].number=0; count++; }

c语言用函数做笨小猴解题思路

c语言用函数做笨小猴解题思路

c语言用函数做笨小猴解题思路C语言用函数做笨小猴解题思路笨小猴是一种著名的编程题,被广泛应用于C语言学习和题目解析中。

学习C语言的过程中,经常需要通过编写函数来解决问题,而笨小猴正是一个很好的案例。

通过笨小猴这个题目,我们可以深入理解函数的概念和运用,展示C语言的强大功能和灵活性。

下面,我们将从简单到复杂、由浅入深地探讨如何用函数来解答笨小猴题目,帮助大家更好地理解这一概念。

一、理解笨小猴题目笨小猴问题是一个典型的算法问题,题目是这样的:有64级楼梯,一只笨小猴子只能跳1级或2级楼梯,编写一个函数计算笨小猴子跳上这64级楼梯一共有多少种跳法。

这个问题看似简单,实际上涉及到递归、循环和函数的使用,非常适合我们来深入探讨C语言函数的应用。

二、编写递归函数一种比较直接的解法是使用递归函数来解决笨小猴问题。

递归函数是指在函数定义中调用函数本身的一种方式,非常适合解决具有递归特性的问题,比如笨小猴跳楼梯的问题。

我们可以定义一个递归函数,用来计算跳上n级楼梯的跳法数量。

在函数内部,通过递归调用自身来实现对所有可能性的遍历,直到跳到1级楼梯或2级楼梯时结束递归。

这样可以实现对笨小猴问题的解决,从而展示了函数在递归运用方面的灵活性和功能强大之处。

三、优化递归函数然而,简单的递归函数在解决笨小猴问题时存在效率不高的问题,因为递归会导致函数的重复调用,增加了计算的时间复杂度。

我们可以通过优化递归函数,引入记忆化搜索等方法来提高计算效率。

在优化后的递归函数中,我们可以使用一个数组来保存已经计算过的结果,避免重复计算,从而大大缩减了计算时间。

这种优化方式可以展示函数在算法优化方面的作用和价值,帮助我们更好地理解函数的灵活运用。

四、使用循环函数除了递归函数,我们还可以使用循环函数来解决笨小猴问题。

通过编写一个循环函数,我们可以遍历所有可能的跳法,逐步累加到64级楼梯的跳法总数。

循环函数相对于递归函数来说,具有更高的计算效率和更好的可读性,尤其适合解决需要迭代计算的问题。

C语言猴子分桃算法

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;这样,无论是递归解法还是数学推理解法,都能求解出猴子分桃问题的答案。

C语言经典案例题

C语言经典案例题

1、题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?#include<stdio.h>int main(){for (int i = 1; i < 5; i++)for (int j = 1; j < 5; j++)for (int k = 1; k < 5; k++)if (i != j&&i != k&&j != k)printf("%d%d%d\n", i, j, k);return 0;}2、题目:企业发放的奖金根据利润提成。

利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){float lirun;printf("请输入当月利润:\n");scanf("%f", &lirun);if (lirun <= 100000)printf("应发放金额总数:%f\n", lirun*0.1);else if (lirun <= 200000 && lirun > 100000){printf("应发放金额总数:%f\n", lirun*0.1 +(lirun - 100000)*0.075);}else if (lirun <= 400000 && lirun > 200000){printf("应发放金额总数:%f\n", lirun*0.1 +(lirun - 100000)*0.075 + (lirun - 200000)*0.005);}else if (lirun <= 600000 && lirun >400000){printf("应发放金额总数:%f\n", lirun*0.1 +(lirun - 100000)*0.075 + (lirun - 200000)*0.005+(lirun-400000)*0.03);}else if (lirun <= 1000000 && lirun >600000){printf("应发放金额总数:%f\n", lirun*0.1 +(lirun - 100000)*0.075 + (lirun - 200000)*0.005 +(lirun - 400000)*0.03+(lirun-600000)*0.015);}else if(lirun >1000000){printf("应发放金额总数:%f\n", lirun*0.1 +(lirun - 100000)*0.075 + (lirun - 200000)*0.005 +(lirun - 400000)*0.03 + (lirun - 600000)*0.015+(lirun-1000000)*0.01);}else{printf("利润为负,没有奖金!!!\n");}return 0;}3、题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?#include<stdio.h>#include<math.h>int main(){int i=0;//判断开方后的数强制转化为整型与不强制转化为整型的数是否相等while (!((int)sqrt(i+100)==sqrt(i+100)&&(int)sqrt(i+100+168)==sqrt(i+100+168))) {i++;}printf("%d\n", i);return 0;}void main(){long int i, x, y, z;for (i = 1; i<100000; i++){x = sqrt(i + 100); /*x为加上100后开方后的结果*/y = sqrt(i + 268); /*y为再加上168后开方后的结果*/if (x*x == i + 100 && y*y == i + 268) /*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/printf("\n%ld\n", i);}getchar();}4、题目:输入某年某月某日,判断这一天是这一年的第几天?#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){int year, month, day;printf("请输入年份:\n");scanf("%d", &year);printf("请输入月份:\n");scanf("%d", &month);printf("请输入日:\n");scanf("%d", &day);int days[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };days[1] = (year % 4 == 0) ? 29 : 28;int sum = 0;for (int i = 0; i < month-1; i++)sum += days[i];sum += day;printf("%d年%d月%d日是第%d天\n", year, month, day, sum);return 0;}5、题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?6、题目:判断101-200之间有多少个素数,并输出所有素数。

数据结构猴子吃桃

数据结构猴子吃桃

目录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。

c语言用函数做笨小猴解题思路

c语言用函数做笨小猴解题思路

c语言用函数做笨小猴解题思路在学习编程语言的过程中,我们经常会遇到需要解决一些问题的情况。

笨小猴这个任务是一个经典的问题,通过使用C语言中的函数,可以很好地解决这个问题。

本文将介绍使用C语言函数的解题思路。

一、问题描述笨小猴问题是这样的:有一只笨小猴想从一座高为n个台阶的山上下来。

笨小猴每次只能跳1个或2个台阶,不能连续跳两个台阶。

请问笨小猴有多少种不同的方式可以从山上下来?二、思路分析为了解决笨小猴问题,我们可以使用递归的方式来求解。

我们可以定义一个函数countWays(n),其中n表示台阶的高度,函数的返回值表示从n高度的台阶上下来的方式数量。

当n=1时,笨小猴只有一种方式,即跳下来;当n=2时,笨小猴有两种方式,可以跳一次两个台阶,也可以跳两次每次一个台阶;当n>2时,笨小猴的方式数量等于跳一次的方式数量加上跳两次的方式数量。

三、编写代码下面是使用C语言编写的解决笨小猴问题的代码:#include <stdio.h>int countWays(int n) {if (n == 1) {return 1;} else if (n == 2) {return 2;} else {return countWays(n - 1) + countWays(n - 2);}}int main() {int n;printf("请输入台阶的高度:");scanf("%d", &n);int ways = countWays(n);printf("笨小猴从%d个台阶上下来的方式数量为:%d\n", n, ways); return 0;}代码中的countWays函数定义了一个递归的方式来计算笨小猴的方式数量。

在主函数中,我们通过用户输入的方式获取台阶的高度,并打印出笨小猴的方式数量。

四、运行结果我们可以编译并运行上述代码,输入台阶的高度,即可得到笨小猴从该高度下来的方式数量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c语言经典问题集锦
一猴子吃桃
问题概述:猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个;第二天早上将剩下的桃子吃掉一半,又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个,到第6天早上想吃时,发现只剩下一个桃子,问第一天共摘了多少桃子。

1 正向思维
第一天共x个桃子吃了x/2+1 剩余x-(x/2+1)=x/2-1个;
第一天共x/2-1个桃子吃了(x/2-1)+1 剩余(x/2-1)-1个;
第三天共(x/2-1)-1个桃子吃了((x/2-1)-1)/2+1 剩余((x/2-1)-1)/2-1 ..............
第十天共1个桃子
2 逆向思维
第十天共1个桃子
第九天剩余1个桃子原来有(1+1)*2=4个桃子
第八天剩余4个桃子原来有(4+1)*2=10个桃子
........
第i天剩余a个桃子原来有(a+1)*2个桃子
........
第1天剩余x/2-1个桃子原来有x个桃子
3 推出c语言代码
#include <stdio.h>
int main(void)
{
int days = 0;
int taos = 1;
for(days=9;days>0;days--)
{
taos = (taos+1)*2;
printf("第%d天原有桃子数taos = %d\n",days,taos);
}
printf("共有桃子数taos = %d\n",taos);
return 0;
}
2 猴子分桃
问题概述:海滩上有一堆桃子,五只猴子来分。

第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。

第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是
这样做的,问海滩上原来最少有多少个桃子?
1 正向思维
总共有x个桃子
第一只猴子扔掉一个,分成5堆,取一堆,则第一只猴子取走了(x-1)/5个,剩下4*(x-1)/5个
第二只猴子扔掉一个,分成5堆,取一堆,则第一只猴子取走了(4*(x-1)/5-1)/5个,剩下4*(4*(x-1)/5-1)/5个
.......................
2 逆向思维
第五只猴子得到a个桃子
则分堆前有5a+1个桃子
第四只猴子得到(5a+1)/4, 则分堆前有5*(5a+1)/4+1=(25a+9)/4个桃子
第三只猴子得到((25a+9)/4)/4, 则分堆前有个桃子5*((25a+9)/16)+1=(125a+61)/16个桃子....
第一只猴子得到((625a+369)/64)/4=(625a+369)/256 则分堆前有5*((625a+369)/256)+1 =(3125a+53)/256+8
即求当上述表达式的结果为整数余数为0时a的值
3 推出c语言代码
#include <stdio.h>
int main(void)
{
long a = 1 ; //第5只猴子得到桃子数
while((3125*a+53)%256!=0)
{
a=a+1;
}
printf("第5只猴子得到桃子数为%d\n",a);
printf("海滩上原来最少有%d个桃子\n",(3125*a+53)/256+8);
return 0;
}
运行结果:
第5只猴子得到桃子数为255
海滩上原来最少有3121个桃子
总结:逆向思维,很多时候可以简化问题
耐心做一点数学公式的推导,也可以简化程序
三猴子选大王
问题概述:
这里的和猴子选大王要求:9只猴子围成一圈。

从第一个猴子开始,依次从1到4报数。

报到4的就落选。

剩下最后的一个,就是猴子大王。

#include <stdio.h>
#define N 9
int main(void)
{
int monkey[N] = {1,1,1,1,1,1,1,1,1};
int monkeySum = N;
int monkeyPos = 0;
int i = 0;
while(monkeySum>1)
{
i = 1;
while(i<5)
{
monkeyPos = monkeyPos + 1;
if (monkeyPos>N-1) monkeyPos = monkeyPos - N;
if (monkey[monkeyPos] == 1) i++;
}
monkey[monkeyPos] = 0;
monkeySum--;
}
i = 0;
for(i=0;i<N;i++)
{
printf("monkey[%d] = %d\n",i,monkey[i]);
if (monkey[i] == 1)
{
printf("大王是第%d只猴子\n",i);
}
}
return 0;
}。

相关文档
最新文档