c语言经典问题-猴子问题
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语言实现
计算海滩上原有桃子多少个
海滩上有一堆桃子,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语言问题关于猴子的问题
第一种方法:利用循环链表 #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语言的强大功能和灵活性。
下面,我们将从简单到复杂、由浅入深地探讨如何用函数来解答笨小猴题目,帮助大家更好地理解这一概念。
一、理解笨小猴题目笨小猴问题是一个典型的算法问题,题目是这样的:有64级楼梯,一只笨小猴子只能跳1级或2级楼梯,编写一个函数计算笨小猴子跳上这64级楼梯一共有多少种跳法。
这个问题看似简单,实际上涉及到递归、循环和函数的使用,非常适合我们来深入探讨C语言函数的应用。
二、编写递归函数一种比较直接的解法是使用递归函数来解决笨小猴问题。
递归函数是指在函数定义中调用函数本身的一种方式,非常适合解决具有递归特性的问题,比如笨小猴跳楼梯的问题。
我们可以定义一个递归函数,用来计算跳上n级楼梯的跳法数量。
在函数内部,通过递归调用自身来实现对所有可能性的遍历,直到跳到1级楼梯或2级楼梯时结束递归。
这样可以实现对笨小猴问题的解决,从而展示了函数在递归运用方面的灵活性和功能强大之处。
三、优化递归函数然而,简单的递归函数在解决笨小猴问题时存在效率不高的问题,因为递归会导致函数的重复调用,增加了计算的时间复杂度。
我们可以通过优化递归函数,引入记忆化搜索等方法来提高计算效率。
在优化后的递归函数中,我们可以使用一个数组来保存已经计算过的结果,避免重复计算,从而大大缩减了计算时间。
这种优化方式可以展示函数在算法优化方面的作用和价值,帮助我们更好地理解函数的灵活运用。
四、使用循环函数除了递归函数,我们还可以使用循环函数来解决笨小猴问题。
通过编写一个循环函数,我们可以遍历所有可能的跳法,逐步累加到64级楼梯的跳法总数。
循环函数相对于递归函数来说,具有更高的计算效率和更好的可读性,尤其适合解决需要迭代计算的问题。
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语言经典案例题
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语言函数的解题思路。
一、问题描述笨小猴问题是这样的:有一只笨小猴想从一座高为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)M只猴子要选大王,选举办法如下:所有猴子按1-M编号围坐一圈,从1号开始按顺序1,2,,,K报数,凡报到K的猴子退出到圈外,如此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和K由输入文件提供,要求在输出文件中打印出最后剩下的猴子的编号。
数据规模(M<=1000,K<=10)【输入文件】输入文件monkey.in 的第1 行,为两个正整数,用一个空格隔开:M K【输出文件】输出文件monkey.out 只有一个正整数,输出最后一个猴子的编号【输入样例】7 3【输出样例】4这就是顶顶有名的约瑟夫问题。
这是一个据说是由古罗马著名史学家Josephus提出的问题演变而来的。
称之为约瑟夫问题。
很多资料上对这一问题解释得过于繁杂,实现起来不好理解。
在这里介绍一下本人的一些想法以供大家参考。
这个题目其实就是一种编程的经验问题。
我们可以假设猴子就位的状态用1表示,把猴子离开的状态用0表示。
那么我们就可以用一个a[M]的数组来存放M个猴子是否就位的状态。
我们可以一边报数一边遍历该数组,每遇到第K个1时,就把当前位置的1变为0,表示当前位置的猴子已经出局了。
一直循环遍历到我们的状态数组只有一个1的时候,这个存放1的数组下标再加上1(因为数组下标是由0开始的,所以要加1)即为选出的大王的编号。
想法很简单,现在关键的问题是如何解决当报数到第M个猴子的时候如何使得下一个报数重新回到第1个猴子处,也就是如何使用一维数组来解决环型问题的求解技巧。
大家想一下当我们的猴子围成圈坐的时候,问题其实由简单的一维数组变成了首尾相接的环型数组,也就是我们数据结构中的环型队列。
假设p为当前数组某一元素的下标,对于一维数组来说,我们只要p++就可以移动到下一个元素的位置上。
那么当p=M时,如果我们直接使用p++的话,p的值就超出了a[M]数组的最大长度,我们想要的是p++之后等于0。
那么如何实现呢?解决环型数组循环遍历元素的方法:对于环型数组移动下标时,我们如果每次在p++之后再加上p=p%M的话就能解决先前遇到的越界的问题。
(完整版)数据结构经典题目及c语言代码
《数据结构》课程设计题目(程序实现采用C语言)题目1:猴子选王(学时:3)一堆猴子都有编号,编号是1,2,3 .。
.m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解.//链表#include 〈stdio.h〉#include 〈stdlib.h>// 链表节点typedef struct _RingNode{int pos;struct _RingNode *next;}RingNode, *RingNodePtr;// 创建约瑟夫环,pHead:链表头指针,count:链表元素个数void CreateRing(RingNodePtr pHead, int count){RingNodePtr pCurr = NULL, pPrev = NULL;int i = 1;pPrev = pHead;while(——count 〉 0){pCurr = (RingNodePtr)malloc(sizeof(RingNode));i++;pCurr—〉pos = i;pPrev-〉next = pCurr;pPrev = pCurr;}pCurr-〉next = pHead; // 构成环状链表}void KickFromRing(RingNodePtr pHead, int n){RingNodePtr pCurr, pPrev;int i = 1; // 计数pCurr = pPrev = pHead;while(pCurr != NULL){if (i == n){// 踢出环printf("\n%d", pCurr->pos); // 显示出圈循序pPrev—>next = pCurr->next;free(pCurr);pCurr = pPrev—>next;i = 1;}pPrev = pCurr;pCurr = pCurr—〉next;if (pPrev == pCurr){// 最后一个printf("\nKing is %d", pCurr—〉pos); // 显示出圈循序 free(pCurr);break;}i++;}}int main(){int n = 0, m = 0;RingNodePtr pHead = NULL;printf("M(person count)= ”);scanf(”%d”, &m);printf("N(out number) = ");scanf(”%d”, &n);if(m 〈= 0 || n <= 0){printf("Input Error\n”);return 0;}// 建立链表pHead = (RingNodePtr)malloc(sizeof(RingNode)); pHead->pos = 1;pHead->next = NULL;CreateRing(pHead, m);// 开始出圈printf("\nKick Order: ");KickFromRing(pHead, n);printf(”\n");system(”pause”);return 0;}//数组做:#include<stdio。
C语言经典例程100例(经典c程序100例)
C语⾔经典例程100例(经典c程序100例)⼩编注:以下代码因为编辑器等原因,需要将原来空⽩区域⽤tab或空格替换即可运营。
【程序1】题⽬:有1、2、3、4个数字,能组成多少个互不相同且⽆重复数字的三位数?都是多少?1.程序分析:可填在百位、⼗位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满⾜条件的排列。
2.程序源代码main(){int i,j,k;printf("\n");for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); }}【程序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,求应发放奖⾦总数?1.程序分析:请利⽤数轴来分界,定位。
注意定义时需把奖⾦定义成长整型。
2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bonus1+(i-100000)*0.075; else if(i<=400000) bonus=bonus2+(i-200000)*0.05; else if(i<=600000) bonus=bonus4+(i-400000)*0.03; else if(i<=1000000) bonus=bonus6+(i-600000)*0.015; else bonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}【程序3】题⽬:⼀个整数,它加上100后是⼀个完全平⽅数,再加上168⼜是⼀个完全平⽅数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开⽅,再将该数加上268后再开⽅,如果开⽅后 的结果满⾜如下条件,即是结果。
(完整word版)编程经典问题
编程经典问题1.“兔子繁殖问题",已知一对兔子,每个月可以生一对兔子,而小兔过一个月后也可生一对小兔。
即兔子的对数是:第一个月1对,第二个月2对,第三个月3对,第四个月5对,……,假设兔子的生育期是12个月,并且不死,问一年后,这对兔子有多少对活着的后代?(P45)(斐波尔系数)2.判断素数。
(P55 P68)3.猴子摘了一堆桃子,第一天吃了一半,觉得不过瘾又吃了一个;第二天吃了剩下的一半零一个;以后每天如此,到第十天,猴子一看只剩下一个了。
问最初由多少个桃子?4.求两个数的最大公约数。
(P49)5.求两个数的最小公倍数。
6.验证歌尔巴德猜想:任意一个充分大的偶数n(n 〉= 4),都可以用两个素数之和表示.(P57 P98)7.逻辑判断题:警官在老王被害现场发现ABCD四名犯罪嫌疑人,讯问中A说“我没有杀人",B说“C是凶手”,C说“杀人者肯定是D ",D 说“C在冤枉好人”。
现已知:四人中有三人说的是真话,一人说的是假话,四名犯罪嫌疑人中有且只有一人是凶手。
请编写程序确定四个嫌疑人中哪个是凶手?(P57)8.宾馆里有100个房间,从1~100编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间再作“相反处理",……,以后每个服务员都是如此。
当第三个服务员把所有编号是3的倍数的房间再作“相反处理”,……,以后每个服务员都是如此。
当第100个服务员来过后,哪几扇门是打开的.(所谓“相反处理"是:原来开着的门关上,原来关上的门打开)(P65)9.约瑟夫问题:n个人(n >= 100)围成一圈,从第一个人开始报数,数到m的人出圈,再由下一个人重新从1开始报数,数到m的人出圈;……直到所有人出圈.输出依次出出圈的人的编号。
10.围绕着山顶有10个洞,一只狐狸和一只兔子各住一个洞.狐狸总想吃掉兔子.一天兔子对狐狸说:“你想吃我有一个条件,先把洞从1~10编上号,你从10号洞出发,先到1号洞找我;第二次隔一个洞找我,第三次隔2个洞找我,以后依此类推,次数不限.若能找到我,你就可以饱餐一顿.不过在没有找到我以前不能停下来."狐狸满口答应就开始找了,它从早到晚找了1000次洞,累得昏了过去也没有找到兔子。
—猴子吃桃课程设计
用C语言解决猴子吃桃子问题摘要本课程设计主要解决猴子吃桃子的问题。
一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
在整个程序中分别采用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
程序通过调试运行,初步实现了设计目标。
1 引言在日常生活中经常遇到一些与数据计算有关的问题,许多与猴子吃桃问题类似的问题要求用计算机程序语言来解决,用这个程序算法可以解决一些类似问题,以便利于生活实际。
一:课程设计背景猴子吃桃问题涉及一个比较有趣的数组,把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数a[i]的递推公式为a[i]=(a[i-1]+1)*2。
a[i]实际代表了倒数第i天剩下的桃子数。
所以可以求得此数组的通项公式为a[i]=3*pow(2,(i-1))-2 (i>=2)二:课程设计目的在这个程序中我们主要是用C语言解决猴子吃桃问题,一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
生活中或学术上有很多类似的问题,这个问题看似简单,却可能使很多重大问题的重要组成部分或者是核心。
解决此问题的目的是以便在生活中解决根本性问题,是生活变得更加便利。
三:课程设计内容这个程序的内容是以C语言为程序语言载体分别用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
2需求分析这个课程设计分为三个部分,即分别用三种不同的方法解决猴子吃桃子问题。
每个部分都有不同的算法思想。
用数组结构实现的算法,通过构造求桃子数的数组,然后输出要求的项来实现。
用链结构实现的算法,则是建立链表,将每天的桃子数目存入链表,然后输出第一天的桃子数。
用递归结构实现的算法,是通过函数本身的特点,反复调用自身,最后找到递归的出口,求得算法的解。
东北大学C语言考试题库及答案
东北大学C语言考试题库及答案————————————————————————————————作者:————————————————————————————————日期:题目:根据下面的函数关系,对输入的每个x值,计算出相应的y值并输出结果。
5 题目:输入一个整数,当为65时显示A,66时显示B,68时显示C,其他值时显示END.(可选用switch 语句编写)6 题目:编写程序将用户输入的字母进行大小写转换。
7 题目:编程判断输入的正整数是否即是5的倍数又是7的倍数.若是则输出该数;否则输出—1。
8 题目:输入一个整数,判断它是奇数还是偶数并输出。
9 题目:从键盘输入二个整数a、b,将其按大到小排列.10 题目:找出不超过1000的十位数字为1,个位数字为3或7的所有数。
例如:13、17、113、317等。
11 题目:输入一个整数,判断该数是否能被3,5,7整除,并输出以下信息之一:(1)能同时被3,5,7整除;(2)能被其中两数(要指出哪两个)整除;(3)被其中一个数(要指出哪一个)整除;(4)不能被3,5,7任一个整除.12 题目:输入一个5位的正整数,判定该正整数是否为一个回文数。
(所谓回文素数是指正读和反读都相同的数,例如12321)。
13 题目:假设变量a、b、c为整数,从键盘读入a、b、c的值,当a为1时显示b与c之和,a为2时显示b与c之差,a为3时显示b与c之积,a为4时显示b/c之商,其他数值不做任何操作.14 题目:输入一个整数,将其数值按小于10,10~99,100~999,1000以上分类并显示(例如:输入358时,显示358 is 100 to 999)。
15 题目:从键盘读入三角形三边,判断能否组成三角形,若可以组成三角形,输出三角形的面积。
16 题目:从键盘读入三角形三边,判断能否组成三角形,若可以组成三角形,输出三角形的类型(等边、等腰、直角、一般)。
17 题目:计算二次方程的根。
用C编写程序猴子选大王
湖南人文科技学院计算机系课程设计说明书课程名称: 数据结构课程代码:题目: 猴子选大王年级/专业/班: 06级计算机科学与技术专业一班学生姓名:学号:06408109 06408102 06408107 0640812206408103指导教师: 刘刚常开题时间: 2008 年 6 月16 日完成时间: 2008 年 6 月29 日目录摘要 (3)一、引言 (4)二、设计目的与任务 (4)三、设计方案 (5)1、总体设计 (5)2、详细设计 (8)3、程序清单 (14)4、程序调试与体会 (22)5、运行结果 (23)四、结论 (24)五、致谢 (24)六、参考文献 (25)摘要本文首先介绍顺序表和链表并作以比较,我们分别使用循环队列和循环链表来解决猴子选大王的问题,程序使用了C语言编写,有很少一部分函数是用C++编写的,有比较详细的中文注释并在VC++下调试运行通过。
整个程序使用中文界面,并有相应的提示信息,便于操作和程序运行。
关键词:循环队列;循环链表;存储结构AbstractThis paper details the difference of sequence list and linklist.We respectively use queue and circular queue and circular linked list to solve the seek elected king of the monkey problem . The procedure write with C language ,a very small part function is used by the C + +,and has chinese explanatory note.What’s more,it was debugged in VC++ debugger and run very well.The whole procedure,with Chinese interface and thecorresponding hints,is convenient to run and easy to be operated.Keywords : circular queue;circular linked list ;storage structure《数据结构》课程设计——猴子选大王一、引言数据结构是一门非常重要的基础学科,但是实验内容大都不能很好的和实际应用结合起来。
猴子选大王(C语言实现)
题目:猴子选王一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。
#include <stdio.h>struct monkey{int num;monkey *next;};monkey *head,*tail;void creat(int n){int i;monkey *p,*q;p=new monkey; //为p分配内存空间p->num=1; //初始化p结点num域为1p->next=NULL; //初始化p结点next域为空head=p; //链表头指针head赋值为pq=p;for(i=2;i<=n;i=i+1) //循环存入猴子{p=new monkey; //为p配内存空间p->num=i; //初始化p结点num域为i,表示猴子号q->next=p; //将p点加到链表尾部q=p; //让指向链表尾部结点p->next=NULL; //链表尾部指向空}tail=q; //链表尾tail->next=head; //链表尾部指向链表头,形成循环链表}void select(int n){int x=0;monkey *p,*q;q=tail; //q赋值给tail,指向循环链表尾部do //直到型循环,用于循环删除指定间隔的结点{p=q->next; //p赋值给相邻的下一个结点x=x+1; //x加1if(x%n==0) //x是否整除m{printf("%d号猴子淘汰\n",p->num);q->next=p->next; //删除此结点delete p; //释放空间p=NULL;}else q=p; //q指向相邻的下一个结点p }while(q!=q->next); //剩余结点数不为1,则继续循环head=q; //head指向结点q,q为链表中剩余的一个结点}void main(){int n,m;head=NULL; //初始化head为空printf("请输入猴子的个数\n");scanf("%d",&m);printf("请输入n\n");scanf("%d",&n);creat(m); //调用函数creat建立循环链表select(n); //调用函数select,找出剩下的猴子printf("猴王是%d号\n",head->num); //输出猴王delete head; //删除循环中最后一个结点}#include<stdio.h>int main(){int a[1000];//定义一个较大的数组存储数据int m,n,x,count,i;//定义猴子数m、输入n、所需变量x、cout、iprintf("请输入猴子个数:\n");//提示输入mscanf("%d",&m);printf("请输入n:\n");//提示输入nscanf("%d",&n);for(i=1;i<=m;i++) //令数组与猴子编号对应a[i]=i;count=m;//令cout等于猴子个数x=0;//令x初始值为零for(i=0;count>1;i++)// 执行循环,淘汰的猴子值为-1,直到只剩一只猴子,即为猴王{if(a[i%m+1]!=-1) {x++;}if(x==n&&a[i%m+1]!=-1){a[i%m+1]=-1;count--;x=0;printf("%d号猴子淘汰\n",i%m+1);} }for(i=1;i<=m;i++) //输出值不为-1的猴子,即猴王if(a[i]!=-1) printf("猴王是%d号\n",i);}。
经典C语言编程100例
经典C语言编程100例(1-30)【程序1】题目:有1、2、3、4个数字,能组成多少个互不1.1、22.{printf("\n");for(i=1;i<5;i++)/*以下为三重循环*/for(j=1;j<5;j++)for(k=1;k<5;k++){if(i!=k&&i!=j&&j!=k)/*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k);}}万提万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.2.{bonus1=100000*0.1;bonus2=bonus1+100000*0 .75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15;if(i<=100000)elsebonus=bonus10+(i-1000000)*0.01; printf("bonus=%d",bonus);}==================================== ==========================1.100后2.#include"math.h"main(){longinti,x,y,z;for(i=1;i<100000;i++){x=sqrt(i+100);/*x为加上100后开方后的结果*/*/}}题目:输入某年某月某日,判断这一天是这一年的第几天?1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
猴子吃桃子问题完美解决版
。
。
如果只吃n天应该一共要吃1 + 3 + 6 + 12 +24+42+。。。。。。。
也就是除了第一天外其余每天吃桃子的个数都是前天的2倍(大家可以从3,6,12,24,48中看出)
因此程序解决办法为
public class Demo03_对象A {
publicstatic void main(String[]args) {
猴子吃桃子问题想必就不用说了:
现在提出解决问题方法:首先说的是谭老的《C语言程序设计》解决办法有问题至于问题在哪里不说。大家可以用软件仿真一下和你算得结果是否相同
分析:
如果只吃一天应该一共只有1个桃子吃1个
如果只吃2天应该是一共3+1 = 4个桃子吃3个
如果只吃3天应该是一共6 + 1+ 3 = 10个桃子吃6个
intday = 10 ;
intsum = 0 ;//sum表示吃到第几天时的桃子总数
inttmp= 3;//tmp每天吃桃子的个数
while(day > 0 ) {
iout.println("第10天还有一个");
} elseif(day == 9) {
sum=tmp+ sum;
} else {
tmp=tmp*2;
sum= sum +tmp;
System.out.println("第"+day+"天还有桃子"+tmp+"个");
}
day--;
}
System.out.println("因此一共有桃子"+sum + "个");
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}。