用C编写程序猴子选大王
猴子选大王
![猴子选大王](https://img.taocdn.com/s3/m/8590100ac281e53a5802ffdc.png)
数据结构课程设计题 目: 猴子选大王系 别: 计算机科学与技术系专业年级: 软件工程2015级姓 名: 穆 军学 号: 20151106218指导教师: 乔 栋2016年12月12日LULIANG UNIVERSITY目录一、设计任务与要求 (1)1.1 总体目标与任务要求 (1)1.2 题目选择与目的意义 (1)二、需求分析 (1)2.1 功能需求分析 (1)2.2 游戏需求分析 (2)三、概要设计 (2)四、详细设计 (3)五、源代码 (5)六、运行结果分析 (7)七、收获与体会 (7)八、主要参考资料 (7)一、设计任务与要求1.1 总体目标与任务要求猴子选大王*问题描述:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
*输入数据:输入m,n m,n 为整数,n<m*输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。
1.2 题目选择与目的意义1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4、训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风二、需求分析2.1功能需求分析功能需求分析模块图如图:2.2 游戏需求分析开发环境:PC机Windows 10系统使用软件:编写实验报告:Microsoft Office Word画图:亿图制作程序:Microsoft Visual C++ 6.0三、概要设计否四、详细设计1、头文件#include<stdio.h>#include<stdlib.h> //使用calloc()函数void FindKing_pointer(int,int,int*);//移动指针法找大王void Initialize(int,int*);//初始化数组整形和指针型2、主函数及定义指针int main(){int m,n,*ptr;printf("输入猴子数\n");scanf("%d",&n);printf("输入猴子出局时报的数\n");scanf("%d",&m);while(n<m)printf("输入数据有误,请重新输入!\n");printf("输入猴子数与出局时报的数\n");scanf("%d %d",&n,&m);}ptr=(int *)calloc(n,sizeof(int));Initialize(n,ptr);FindKing_pointer(m,n,ptr);free(ptr);return 0;}3、在数组中依次填入1,2,3,4,…void Initialize(int n,int *ptr){int i;for(i=0;i<n;i++)ptr[i]=i+1;}/*循环一次指针向后移一位,所指元素不为0时计数器加1.移动指针,当计数器数到m时将指针所指元素设为0.*/void FindKing_pointer(int m,int n,int *ptr){int i,count,*ptr2;count=n-1; //count=0时终止循环就是只剩一个猴子时ptr2=ptr; // 移动ptr2进行查找开始时ptr为多少//calloc()为指针类型的元素分配内存时,元素被初始化为空指针for(i=0;count!=0;ptr2++){if(ptr2==ptr+n)ptr2=ptr;/*指针所指元素不为0时计数器加1.*/if(*ptr2!=0)i++;/*计数器数到m时将指针所指元素设为0*/if(i==m){*ptr2=i=0;count--; //用于终止循环}}4、最后不为0的元素的值即为大王的编号for(ptr2=ptr;;ptr2++){if(*ptr2!=0)printf("第%d个猴子是大王\n",*ptr2);break;}}}五、源代码#include<stdio.h>#include<stdlib.h> //使用calloc()函数void FindKing_pointer(int,int,int*);//移动指针法找大王void Initialize(int,int*);//初始化数组整形和指针型int main(){int m,n,*ptr;printf("输入猴子数\n");scanf("%d",&n);printf("输入猴子出局时报的数\n");scanf("%d",&m);while(n<m){printf("输入数据有误,请重新输入!\n");printf("输入猴子数与出局时报的数\n");scanf("%d %d",&n,&m);}ptr=(int *)calloc(n,sizeof(int));Initialize(n,ptr);FindKing_pointer(m,n,ptr);free(ptr);return 0;}void Initialize(int n,int *ptr){int i;for(i=0;i<n;i++)ptr[i]=i+1;}/*循环一次指针向后移一位,所指元素不为0时计数器加1.移动指针,当计数器数到m时将指针所指元素设为0.*/void FindKing_pointer(int m,int n,int *ptr){int i,count,*ptr2;count=n-1; //count=0时终止循环就是只剩一个猴子时ptr2=ptr; // 移动ptr2进行查找开始时ptr为多少//calloc()为指针类型的元素分配内存时,元素被初始化为空指针for(i=0;count!=0;ptr2++){if(ptr2==ptr+n)ptr2=ptr;/*指针所指元素不为0时计数器加1.*/if(*ptr2!=0)i++;/*计数器数到m时将指针所指元素设为0*/if(i==m){*ptr2=i=0;count--; //用于终止循环}}/*最后不为0的元素的值即为大王的编号*/for(ptr2=ptr;;ptr2++){if(*ptr2!=0){printf("第%d个猴子是大王\n",*ptr2);break;}}}六、运行结果分析1.运行结果:七、收获与体会本次数据结构课程设计是运用所学知识,锻炼实际解决问题的能力,是对学生实际对数据结构掌握程度的考验和提高。
数据结构习题及答案 (7)
![数据结构习题及答案 (7)](https://img.taocdn.com/s3/m/fa30af650975f46526d3e12a.png)
第五章数组和广义表一、选择题1. 常对数组进行的两种基本操作是()(A)建立与删除(B)索引和修改(C)查找和修改(D)查找与索引参考答案:C2.二维数组M的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到4,列下标j的范围从0到5,M按行存储时元素M[3][5]的起始地址与M按列存储时元素( ) 的起始地址相同。
(A)M[2][4](B)M[3][4](C)M[3][5](D)M[4][4]参考答案:B3.数组A[8][10]中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元数是()。
(A)80(B)100(C)240(D)270参考答案:C4.数组A[8][10]中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[7][4]的起始地址为()。
(A)SA+141(B)SA+144(C)SA+222(D)SA+225参考答案:C5.数组A[8][10]中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,该数组按列存放时,元素A[4][7]的起始地址为()。
(A)SA+141(B)SA+180(C)SA+222(D)SA+225参考答案:B6.稀疏矩阵一般的压缩存储方法有两种,即()。
(A)二维数组和三维数组(B)三元组和散列(C)三元组和十字链表(D)散列和十字链表参考答案:C7.若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种观点()。
(A)正确(B)错误参考答案:B8.设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分按行序存放在一维数组B[1,n(n-1)/2]中,对下三角部分中任一元素ai,j(i<=j),在一组数组B的下标位置k的值是()。
(A)i(i-1)/2+j-1(B)i(i-1)/2+j(C)i(i+1)/2+j-1 (D)i(i+1)/2+j参考答案:B二、填空题1.己知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A[0][0]),则A[0][0]的地址是_____________________。
C#中算法
![C#中算法](https://img.taocdn.com/s3/m/294cd48471fe910ef12df82e.png)
C#使用MD5算法对密码进行加密对密码进行加密的算法有很多种,在C#中较常使用的是MD5加密算法。
它是一种用于产生数字签名的单项散列算法,具体代码如下:public string Encrypt(string strPwd){MD5 md5 = new MD5CryptoServiceProvider();byte[] data = System.Text.Encoding.Default.GetBytes(strPwd);//将字符编码为一个字节序列byte[] md5data = puteHash(data);//计算data字节数组的哈希值md5.Clear();string str = "";for (int i = 0; i <md5data.Length-1; i++){str += md5data[i].ToString("x").PadLeft(2,'0');}return str;}注意:在编码之前应先引入命名空间System.Security.Cryptography。
而且始用散列算法对原始密码加密后无法再恢复。
这也是MD5加密算法的一个蔽端。
C#实现二、八、十六进制数转十进制数的算法二进制换为十进制的方法,例如:二进制数:11001十进制数:1*24+1*23+0*22+0*21+1*20=25八进制换为十进制的方法,例如:八进制数:32007十进制数:3*84+2*83+0*82+0*81+7*80=13319十六进制换为十进制的方法,例如:十六进制数:a20f(由于十六进制数用a~f表示10~15之间的数,所以计算时将a~f用10~15表示)十进制数:10*83+2*82+0*81+15*80=41487通过以上二、八、十六进制数转十进制数的计算方法,可得出计算的代码为://参数Num为需要转换的数,n为该数的进制public string ToD(string Num, int n){char[] nums=Num.ToCharArray ();int d = 0;for (int i = 0; i <nums.Length ; i++){string number=nums [i].ToString ();if (n == 16){switch (number.ToUpper ()){case "A":number = "10";break;case "B":number = "11";break;case "C":number = "12";break;case "D":number = "13";break;case "E":number = "14";break;case "F":number = "15";break;}}Double power = Math.Pow(Convert.ToDouble (n),Convert.ToDouble ( nums.Length - (i +1)));d = d + Convert.ToInt32 (number) * Convert.ToInt32 (power);}return d.ToString ();}C#十进制数转十六进制数的算法十进数转换为十六进制数的方法与以上两种的转换方法相似,不同之处除了除数改为16外,还需要将余数为10~15的数改为A~F的形式。
经典C语言问题关于猴子的问题
![经典C语言问题关于猴子的问题](https://img.taocdn.com/s3/m/40c7e2fc700abb68a982fbc3.png)
第一种方法:利用循环链表 #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语言-猴子选大王](https://img.taocdn.com/s3/m/9ccb56acfd0a79563c1e721a.png)
do//输入总个数
{
printf("请输入总个数(1-%d):",MAXN);
scanf("%d",&m);
}while((m<1)||(m>MAXN));
do//输入出圈时要数到的个数
{
printf("要数到的个数(1--%d):",m);
scanf("%d",&n);
}
for(i=m-1;i>=0;i--)
printf("%4d",a[i]);
printf("\n");
}
}
3.#include<stdio.h>
#include<stdlib.h>
#define MAXN 100 /*定义猴子总数*/
void main()
{
int i,j,*a,m,n,s1,w;
do//输入总个数
printf("\n");
}
}
4.#include<stdio.h>
#include<stdlib.h>
#define MAXN 100 //最大个数
struct Node
{
int data;
struct Node *next;
};
void main()
{
struct Node *head, *s, *q, *t;
for(j=s1;j<i;j++) //原来第i+1个至倒数第i个元素依次向前移动一个位置。
蓝桥杯-猴子选大王(约瑟夫问题)
![蓝桥杯-猴子选大王(约瑟夫问题)](https://img.taocdn.com/s3/m/b62e3ff7951ea76e58fafab069dc5022aaea46b7.png)
蓝桥杯-猴⼦选⼤王(约瑟夫问题)标题:猴⼦选⼤王⼀群猴⼦要选新猴王。
新猴王的选择⽅法是:让N只候选猴⼦围成⼀圈,从某位置起顺序编号为1~N号。
从第1号开始报数,每轮从1报到3,凡报到3的猴⼦即退出圈⼦,接着⼜从紧邻的下⼀只猴⼦开始同样的报数。
如此不断循环,最后剩下的⼀只猴⼦就选为猴王。
请问是原来第⼏号猴⼦当选猴王?输⼊格式:输⼊在⼀⾏中给⼀个正整数N(≤1000)。
输出格式:在⼀⾏中输出当选猴王的编号。
输⼊样例:11输出样例:7思路⼀:⽤数组模拟⼀个环,存储第下标+1位猴⼦是否退出(因为下标从0开始),数组初始化为0,每次轮到数3的猴⼦就将他的下标置为-1,最后⼀个下标不为-1的猴⼦就是选中的王。
1 #include<bits/stdc++.h>2using namespace std;34const int N = 1000; //共有N个猴⼦56int a[N]; //⽤数组和%操作模拟圈78int index = 0; //下标index9int i = 1; //⽤来对3计数10int counter; //记录每次剩下的猴⼦个数1112int main()13 {14int num; //num是猴⼦的数量15 cin >> num;16 counter = num;1718while(counter > 1)19 {20if(a[index] != -1) //当下标为index的猴⼦还在圈内时21 {22if(i == 3)23 {24 a[index] = -1; //将数到3的猴⼦退出圈⼦,将下标置为-125 counter--; //剩下的猴⼦总个数-126 }2728 i++;2930if(i > 3) //i=4时候,i要回到131 {32 i = i % 3;33 }34 }3536 index++;3738if(index >= num) //当下标达到了猴⼦总数时,要回到开头39 {40 index = index % num;41 }4243 }4445for(int i = 0; i < num; i++)46 {47if(a[i] != -1)48 {49 cout << i + 1; //数组下标是从0开始的,要+150 }51 }5253return0;54 }思路2:使⽤递归思想1 #include<bits/stdc++.h>2using namespace std;34int fun(int n)5 {6if(1 == n)7 {8return0;9 }1011return (fun(n - 1) + 3) % n;12 }1314int main()15 {16int n;17 cin >> n;18 cout << fun(n) + 1;19return0;20 }。
约瑟夫问题
![约瑟夫问题](https://img.taocdn.com/s3/m/5bb20d7627284b73f24250a3.png)
4、狐狸捉兔子
题目:
围绕着山顶有10个洞,狐狸要吃兔子,兔子说:“可以,但必须找到我,我就藏身于这十个洞中,你从10号洞出发,先到1号洞找,第二次隔1个洞找,第三次隔2个洞找,以后如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。问兔子究竟藏在哪个洞里?
参考程序下载
--------------------------------------------------------------------------------
5、进制转换
题目:
将一个十进制自然数转换成二进制数,一般采取除2取余法。从键盘输入一个十进制自然数(约定该数小于等于Maxlongint),输出相应的二进制数
设有一天平,可用来称物体的质量,同时给出一个正整数n(n<=10)。
问题1:试设计n个砝码的质量,用它们能称出尽可能多的1,2,3,...连续整数质量,约定砝码可以放在天平的左右两个托盘中的任何一个或两个中。例如n=2,此时设计2个砝码的质量分别为1,3,则能同时称取1,2,3,4。
问题2:在给出n个砝码能称出最大质量范围内的一个质量x,试给出称取x的方案。如上例中:
6/7,7/8,1/1
编程求出n级法雷序列,每行输出10个分数。n的值从键盘输入。
--------------------------------------------------------------------------------
13、砝码设计
题目:
①把组成这个四位数的4个数字由小到大排列,形成由这四个数字组成的最大的四位数;
②把组成这个四位数的4个数字由大到小排列,形成由这四个数字组成的最小的四位数(如果含有数字0,则不足四位);
C语言课程设计题目
![C语言课程设计题目](https://img.taocdn.com/s3/m/e892b647e45c3b3566ec8b0f.png)
基本要求:
1、设每个记录有下列数据项:电话号码、用户名、地址;
2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;
3、采用再哈希法解决冲突;
4、查找并显示给定电话号码的记录;
5、查找并显示给定用户名的记录。
6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至少两种),考察平均查找长度的变化。
2
五子棋小游戏
设计实现基于命令行的五子棋小游戏
1、实现五子棋的人人对局功能
2、实现五子棋的人机对局功能
3、实现两机对局
要求:具体的图形化展示整个游戏。1、2必须实现,第3不做要求,根据个人能力自己决定是否实现(不实现不影响成绩,如果能实现将得到加分)。
3
俄罗斯方块游戏
设计实现一个具有基本形状的俄罗斯方块游戏
(3)如何把某一个k进制的数化为10进制数
采用文件、Windows图形化输入界面等操作来实现。
6
用指针优化学生成绩排名
1.定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据,要求用指针实现
2.将数组stu[10]的内容输出到屏幕上,要求用指针实现
3.将成绩数组按照从高到低进行排序,要求用指针实现
C语言课程设计
一、游戏类题目
序号
题目名称
题目要求
1
马踏棋盘
设计一个国际象棋的马踏棋盘的演示程序
要求:具体的图形化展示整个游戏。将马随机放在国际象棋的8×8棋盘的某个方格中,马按照走棋的规则进行移动。要求每个方格只进入一次,走遍棋盘的全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将1,2,…,64依次填入一个8×8的方阵,并输出。
猴子选大王问题
![猴子选大王问题](https://img.taocdn.com/s3/m/2024850569dc5022abea0096.png)
猴子选大王问题集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段]约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例:#include<iostream>usingnamespacestd;voidmain(){intn,m,a[101],k,i,j,num;//计数器是从1开始的,所以100个人用101cout<<"请输入参加游戏的玩家人数(不超过100人):";cin>>n;cout<<"----------------------------------------"<<endl;if(n>100){cout<<"玩家太多,请重新登陆此程序!"<<endl;return;}cout<<"输入游戏中要玩的数字:";cin>>m;cout<<"----------------------------------------"<<endl;for(i=1;i<=n;i++){a【i】=1;//注意百度百科里不让使用ASCII里的方括号,这里是中文字符集里的方括号,}j=0;k=0;for(i=1;i<=n+1;i++){if(a【i】==1){j=j+a【i】;if(j==m){j=0;a【i】=0;k++;}if(k==n){num=i;break;}}if(i==n+1)i=0;}cout<<"最后获胜的玩家是第"<<num<<"号玩家!"<<endl;cout<<"----------------------------------------"<<endl; }写完密码约瑟夫就想到原来看到约瑟夫问题的一个数学解法很巧妙很简单不过只能推出最后一个出列的人无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。
数据结构课程设计(附代码)-数据结构设计
![数据结构课程设计(附代码)-数据结构设计](https://img.taocdn.com/s3/m/0ee13834240c844768eaee69.png)
上海应用技术学院课程设计报告课程名称《数据结构课程设计》设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级姓名学号指导教师日期一.目的与要求1. 巩固和加深对常见数据结构的理解和掌握2. 掌握基于数据结构进行算法设计的基本方法3. 掌握用高级语言实现算法的基本技能4. 掌握书写程序设计说明文档的能力5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力表。
3、输出功能:void print(LinkList *head);通过一个while的循环控制语句,在指针p!=NULL时,完成全部学生记录的显示。
知道不满足循环语句,程序再次回到菜单选择功能界面。
4、删除功能:LinkList *Delete(LinkList *head);按想要删除的学生的学号首先进行查找,通过指针所指向结点的下移来完成,如果找到该记录,则完成前后结点的连接,同时对以查找到的结点进行空间的释放,最后完成对某个学生记录进行删除,并重新存储。
5、插入功能:LinkList *Insert(LinkList *head);输入你想插入的位置,通过指针所指向结点的下移,找到该位置,将该新的学生记录插入到该结点,并对该结点后面的指针下移。
链表长度加一,重新存储。
(5) 程序的输入与输出描述输入:调用LinkList *create()函数,输入学生的姓名、学号、三门功课的成绩;输出:调用void print(LinkList *head)函数,输出学生的记录。
(6) 程序测试主菜单:成绩管理系统的主界面:学生成绩记录的输入:输出学生成绩记录:学生成绩记录的删除(删除学号是1101的学生记录)插入新的学生成绩记录(插入学号为1103的学生记录)(7) 尚未解决的问题或改进方向尚未解决的问题:该成绩管理系统还存在不少缺陷,而且它提供的功能也是有限的,只能实现学生成绩的输入、输出、删除、插入。
猴子选大王问题
![猴子选大王问题](https://img.taocdn.com/s3/m/d0443499763231126fdb111e.png)
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段] 约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例: #i n c l u d e<i o s t r e a m>u s i n g n a m e s p a c e s t d;v o i d m a i n()i n t n,m,a[101],k,i,j,n um; //计数器是从1开始的,所以100个人用101 c o u t<<"请输入参加游戏的玩家人数(不超过100人):";c i n>>n;c o u t<<"----------------------------------------"<<e nd l;i f(n>100){c o u t<<"玩家太多,请重新登陆此程序!"<<e nd l;r e t u r n;}c o u t<<"输入游戏中要玩的数字:";c i n>>m;c o u t<<"----------------------------------------"<<e nd l;f o r(i=1;i<=n;i++){ a【i】=1;//注意百度百科里不让使用ASCII里的方括号,这里是中文字符集里的方括号,}j=0;k=0;f o r(i=1;i<=n+1;i++){i f(a【i】==1){j=j+a【i】;i f(j==m)j=0;a【i】=0;k++;}i f(k==n){n u m=i;b r e a k;}}i f(i==n+1)i=0;}c o u t<<"最后获胜的玩家是第"<<n u m<<"号玩家!"<<e nd l;c o u t<<"----------------------------------------"<<e nd l;}写完密码约瑟夫就想到原来看到约瑟夫问题的一个数学解法很巧妙很简单不过只能推出最后一个出列的人无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。
猴子选大王问题
![猴子选大王问题](https://img.taocdn.com/s3/m/9f4bb0331711cc7931b716a2.png)
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段]约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例:#include<iostream>usingnamespacestd;voidmain(){intn,m,a[101],k,i,j,num;.n-2,n-1,0,1,2,...k-2并且从k开始报0。
现在我们把他们的编号做一下转换:k-->0k+1-->1k+2-->2......k-2-->n-2k-1-->n-1变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n 个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x'=(x+k)modn 如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。
猴子算法
![猴子算法](https://img.taocdn.com/s3/m/a70a824f2b160b4e767fcf52.png)
一、猴子选大王:(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++ 程序](https://img.taocdn.com/s3/m/18a4cd7da417866fb84a8e97.png)
{
count=0;
for(i=0;i<number;i++)
{ sum=sum+a[i];
if(sum==del)
sum=a[i]=0;//猴子被淘汰
count=count+a[i];//到count的值为1时结束循环,表明只剩一只猴子为大王
monkey monkey(p,q);//定义一个monk总数M和淘汰猴子N:";
cin>>p>>q;
cout<<monkey.choose(p,q)+1<<endl;
return 0;}
#include<iostream>
using namespace std;
class monkey//定义一个类
{
private:
int number;
int del;
public:
monkey(int n,int d){number=n,del=d;}//建立一个构造函数
int choose(int number,int del)
{int i;
int *a;
a=new int[number];//用new来开辟内存
for(i=0;i<number;i++)
a[i]=1;//是1的被选中,0的话不被选中
int sum=0;//初始化
int count=number;
if(del==1)
{return (number-1);}
猴子选大王问题
![猴子选大王问题](https://img.taocdn.com/s3/m/9b3eeca09b89680203d825eb.png)
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段] 约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例: #i n c l u d e<i o s t r e a m>u s i n g n a m e s p a c e s t d;v o i d m a i n(){i n t n,m,a[101],k,i,j,n u m;.n-2,n-1,0,1,2,...k-2并且从k开始报0。
现在我们把他们的编号做一下转换:k-->0 k+1--> 1k+2--> 2......k-2-->n- 2k-1-->n- 1 变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x'=(x+k)m o d n 如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。
数据结构经典题目及c语言代码
![数据结构经典题目及c语言代码](https://img.taocdn.com/s3/m/1b0c2e082b160b4e767fcf9c.png)
《数据结构》课程设计题目(程序实现采用C语言)题目1:猴子选王(学时:3)一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。
n");return;}n", position+1);}}}ame,&stuff[i].department,&stuff[i].basepay,&stuff[i].allowance);if((fp=fopen("","wb"))==NULL){printf("Can't open file\n");return 0;}for(i=0;i<SIZE;i++)if(fwrite(&stuff[i],LENTH,1,fp)!=1)printf("文件写入出错\n");fclose(fp);if((fp=fopen("","rb"))==NULL){printf("Can't open file\n");}printf("修改过后的结果:\n");for(i=0;i<SIZE;i++){fread(&stuff[i],LENTH,1,fp);stuff[i].total=stuff[i].basepay+100+stuff[i].allowance;printf("%-10s%-10s %f %f %f\n",stuff[i].name,stuff[i].department,stuff[i].basepay+100,stuff[i].allowance,stuff[i ].total);}fclose(fp);return 0;}题目4:满足条件的有序表生成(学时:3)已知三个有序表A、B、C,它们皆由同一类元素构成,现要求对于表A作以下运算而获得有序表D:排出A中所有的既在B中又在C中出现的元素。
用C编写程序猴子选大王
![用C编写程序猴子选大王](https://img.taocdn.com/s3/m/12efe1003c1ec5da51e27039.png)
湖南人文科技学院计算机系课程设计说明书课程名称: 数据结构课程代码:题目: 猴子选大王年级/专业/班: 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语言实现)
![猴子选大王(C语言实现)](https://img.taocdn.com/s3/m/216373df33d4b14e852468fc.png)
题目:猴子选王一堆猴子都有编号,编号是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);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南人文科技学院计算机系课程设计说明书课程名称: 数据结构课程代码:题目: 猴子选大王年级/专业/班: 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《数据结构》课程设计——猴子选大王一、引言数据结构是一门非常重要的基础学科,但是实验内容大都不能很好的和实际应用结合起来。
从而让很多学生认为学习数据结构并没有很大的作用。
但本实验运用数据结构的知识,很好的解决了一个对于人脑来说比较烦琐的实际问题。
链表是一种以链式结构存储的线性表,特点是数据元素可以用任意的存储单元存储,线性表中逻辑上相邻的两元素存储空间可以是不连续的。
同时为了表示逻辑关系,每个数据元素除了存放自身的数据信息外还要存储一个指示其直接后继的信息。
队列是一种先进先出的线性表。
它只允许在的表的一端进行插入,而在另一端删除元素。
循环队列是队列的顺序表示和实现。
从时间上考虑顺序表中插入和删除元素的时间复杂度为O(N) , 查找元素的时间复杂度为O(1); 而链表中插入和删除元素的时间复杂度为O(1) , 查找元素的时间复杂度为O(N)。
而链表中除了存放自身的数据信息外, 还要存放后继结点的地址信息, 存储密度不高。
本设计分别通过一个顺序存储结构和一个链表存储结构,再加适当函数与改变,就简明的解决了猴子选大王这个实际问题,其中顺序存储结构我们使用的是循环队列。
依次按要求淘汰猴子一直到找到猴王,并依次显示被淘汰猴子的编号,输出猴王的编号。
该程序具有一定的通俗性与实用性,其他类似的算法均可借鉴和参考使用。
该程序清单详细具体、全面,为了使组员之间能够很好的理解各自完成的程序,促进组员之间的沟通,我们在程序中添加了较多的注释和说明,具有很强的可读性。
二、设计目的与任务1、本课程设计的目的1)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能并培养学生进行规范化软件设计的能力。
2)训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题;3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4)训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
5)使学生会使用各种计算机资料和有关参考资料,提高学生进行程序设计基本能力。
2、本课程设计的任务问题描述:1)分别使用顺序和链表二种存储结构2)功能实现:一群猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
输入数据:输入m,n 。
其中m,n 为整数,n<m输出形式:依次显示离开圈的猴子编号,并且输出为大王的猴子编号。
三、设计方案1、总体设计1)使用顺序存储结构实现我们选择的是使用一个循环队列来完成这个设计。
定义并构造一个空循环队列,把猴子按照1到m的顺序依次进入该队列,再按题目要求把被淘汰的猴子踢出队列,使用两个循环把被淘汰猴子的编号和猴王的编号分别输出。
本设计使用循环队列求解猴子选大王的问题,程序中定义的数据结构如下:定义一个循环队列typedef struct SqQueue进队列int EnQueue(SqQueue &Q,QElemType e)出队列int DeQueue(SqQueue &Q,QElemType &e)主程序包含模块:typedef struct SqQueue{ //定义一个循环队列}SqQueue;int InitQueue(SqQueue &Q){ //初始化}int EnQueue(SqQueue &Q,QElemType e){ //进队列} //EnQueue() endint DeQueue(SqQueue &Q,QElemType &e){ //出队列} //DeQueue() endint QueueLength(SqQueue Q){ //返回Q的元素个数,即队列的长度} // QueueLength() end void exit(){ }void Change(SqQueue &Q){ //选大王}void main(){ SqQueue Q;InitQueue(Q);Change(Q);}2)使用链表存储结构实现我们选择用一个循环链表来完成该设计,设计一个猴子的结构体, 并开辟空间用来存储猴子结构,生成了一个猴子结构的循环链表,对链表中的猴子进行编号,报号到n的猴子被淘汰,最后剩下的猴子为猴王,把依次被淘汰的猴子和猴王输出。
本设计使用循环链表求解猴子选大王的问题,程序中定义的数据结构如下:设计一个猴子的结构体typedef struct monkey开辟空间用来存储猴子结构head=p=p2=(LINK)malloc(sizeof(Monkey))开辟新空间用来存各个猴子结构p=(LINK)malloc(sizeof(Monkey))把链表变成循环链表p2->next=head报号为n的猴子被淘汰,最后剩下的是猴王,输出被淘汰的猴子和猴王while(1){if(i==m){ printf("%d号猴被淘汰\n",p->num)}else{ //没有报到m的继续报数}printf("猴王的编号为:%d",p->num);}3)菜单选择函数程序int menu_select() //{int x;printf(" \t\t 猴子选大王系统\n");printf(" \t\t 1 使用顺序表\n");printf(" \t\t 2 使用链表\n");printf(" \t\t 请选择:") ;2、详细设计1)使用顺序存储结构实现(1) 输入m,n.m是猴子的总个数,n是小于m的正整数数。
(2) 把m只猴子编上好“1,2,3……m”然后按照1--m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
(3) 输出最后剩下的那只猴子的编号,这猴子就是大王。
(4) 对结果进行分析本程序设计中所包括的函数如下:typedef int QElemType;typedef struct SqQueue //定义一个循环队列{ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、}SqQueue;int InitQueue(SqQueue &Q) //初始化{ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、}int EnQueue(SqQueue &Q,QElemType e) //进队列{ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、} //EnQueue() endint DeQueue(SqQueue &Q,QElemType &e) //出队列{ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、} //DeQueue() endint QueueLength(SqQueue Q) //返回Q的元素个数,即队列的长度{、、、、、、、、、、、、、、、、、、、、、、、、、、、、、} // QueueLength() endvoid exit(){}void Change(SqQueue &Q)//选大王{int n,m;int e;cout<<"输入猴子总数:";cin>>m;for(int j=1;j<=m;j++)EnQueue(Q,j);cout<<"从第1个开始数,每数到第n个,该猴子将离开此圈"<<endl;cout<<"请输入n:"<<endl;cin>>n;cout<<"被淘汰猴子的顺序为:";if(n<m){while(QueueLength(Q)!=1) //当只剩下一个元素时循环结束,依次输出被淘汰猴子编号{for(int i=0;i<n-1;i++){e=DeQueue(Q,e);EnQueue(Q,e);}e=DeQueue(Q,e);cout<<e;}while(Q.front!=Q.rear) //循环到最后找出猴王{for(int i=0;i<n-1;i++){e=DeQueue(Q,e);EnQueue(Q,e);}e=DeQueue(Q,e);}cout<<"猴王是编号为"<<e<<"的猴子"<<endl;Change(Q);}}void main(){SqQueue Q;InitQueue(Q);Change(Q);}2)使用链表存储结构实现(1) 设计一个猴子的结构体,typedef struct monkey(2) 输入m,n.m是猴子的总个数,n是小于m的正整数数。