c语言选举猴王题目
# includestdio.h
void main()
{
void left(int *p,int n);
Int i,numn猴子要选国王,选法如下:所有猴子用1,2编号.....n并按顺序围成一个圈,从第k只猴子开始。 还好还能找到原问题。。。嗯,还好这个问题也是著名的链表经典。我把网上的答案整理了一下,自己复习了一下。
原标题(完整叙述):
m猴要选王者。选举方法如下:所有猴子按照1,2的数量围成一个圈...n,从数字1开始,顺序是1,2...M,所有报出数字M的人退出圈子,以此类推,直到圈子里只剩下一只猴子,这只猴子就是国王。
c解决方案
#包括iostream
使用命名空间std
结构猴子//结构声明
{
int num//Integer,用来记录猴号。
猴子*下一个;//猴子结构指针
};
猴子*头,*尾;//猴子结构指针,全局变量
Void creat(int nn) //被调用的函数
{//函数体开始
int I;//整型变量I,用于计数。
猴子*p,* q;//声明猴子结构指针p,q
p =新猴;//为p分配内存空间。
p-num = 1;//将P节点的num字段初始化为1。
p-next = NULL;//初始化P节点的下一个字段为空。
head = p;//链表的头指针赋给p。
q = p;//q赋给p。
for(I = 2;i = nnI=i 1) //使用循环结构构造一个链表。
{
p =新猴;//为p分配内存空间。
p-num = I;//将P节点的num字段初始化为I,表示猴子号。
q-next = p;//将点P添加到链表的末尾。
q = p;//让指针指向链表的结束节点。
p-next = NULL;//链表的结尾指向null。
}
尾巴= q;//链表尾
tail-next = head;//链表的尾部指向链表的头部,形成一个循环链表。
}
//被调用的函数select,mm表示节点删除间隔。
空心选择(毫米)
{//函数体开始
int x = 0;//声明整数值x并将其初始化为0。
猴子*p,* q;//声明指针变量p,q
q =尾部;//q赋给tail,指向循环链表的末尾。
Do // Until循环,用于按指定间隔删除节点。
{
p = q-next;//p分配给下一个相邻节点
x = x ^ 1;//x加1
if(x%mm==0) //x能被mm整除吗?
{
Cout "删除的猴号是" p-num " \ n ";
q-next = p-next;//删除此节点
删除p;//释放空间
p = NULL
}
其他
q = p;//q指向下一个相邻节点p。
}while(q!= q-next);//如果剩余节点数不为1,则继续循环。
head = q;//head指向节点Q,也就是链表中剩余的节点。
}//函数体结束
Int main() //函数体开始
{
int n,m;//声明整数变量n,m。
head = NULL//初始化头为空
Cout "请输入猴子的数量\ n ";//提示信息
cinn//输入要插入的节点的数据。
Cout "请输入时间间隔\ n ";//提示信息
cinm//输入间隔
创建(n);//调用creat函数建立循环链表。
选择(m);//调用函数select找到剩下的猴子。
Cout”孙悟空是“头数”\ n”;//输出孙悟空
删除标题;//删除循环中的最后一个节点。
返回0;
}//函数体结束
==========================================
c编程语言
#包含stdio.h
#包含stdlib.h
#定义n 5 //宏定义,设置猴子数量。
#define m 4 //报告的最大数量为4。
Typedef struct monkey //设计一个monkey结构,用monkey //link表示,表示结构的指针。
{
int num//它的编号
struct monkey * next//下一只猴子的地址指针
}猴子,*链接;
void main()
{
链接p,头,p2;//定义三个猴子结构的指针。
int I;
head = p = p2 =(LINK)malloc(sizeof(Monkey));//为存储猴子结构开辟空间。
for(I = 1;在;I) //生成了一个猴子结构的链表。
{
p =(LINK)malloc(sizeof(Monkey));//开辟一个新的空间来存放各种猴子结构。
p2-next = p;
p2 = p;
}
p2-next = head;//这一步很重要,这样链表就变成了循环链表,也就是说链表达到了纽结。
//最后,它的下一个地址就是链表的头,如果一直下去,就是一个圈。
p =头部;
Printf("给猴子编号!\ n ");
for(I = 1;I = n;我)
{
p-num = I;//给猴子编号
Printf("%d猴子:%d\n ",p-num,p-num);
p = p-next;//指针指向下一只猴子
}//所有猴号都结束了。
I = 0;
p =头部;//并将P指向链表的头部。
while(1)
{
我;
Printf("%d猴报:%d\n ",p-num,I);
If(p-next==p)//这是结束条件。你认为你的下一个是你自己,是吗?
//明就剩下自己,也就是国王了。
打破;
If(i==m) //如果这个报告了几米,
{
I = 0;//再从1开始报数,因为后面会执行I语句。
Printf("%d只猴子被淘汰\n ",p-num);//有这个号的猴子会被淘汰。
printf(" \ n ");
p2-next = p-next;//将猴子从链表中取出。
p = p2-next;//指针指向下一只猴子
继续;//这句话可以省去,没用。
}
Else //没有向M汇报的继续报数。
{
如果(i==m-1)
p2 = p;
p = p-next;
}
}
Printf("赢家:%d ",p-num);
}
==========================================
帕斯卡语言
var a,b,c,d,n,m:整数;管理员:数组[1..50]的整数;
开始
b:= 0;
读(n,m);
for a:= 1 to n do admin[a]:= a;
b:= m;
对于a:=1到n-1 do
开始
admin[b]:= 0;
当cm开始时
b:= B1;
如果bn那么b:= b mod n;
如果admin[b]0那么c:= c 1;
结束;
c:= 0;
结束;
对于a:=1到n do如果admin[a]0则写(a);
结束。
c语言孙悟空问题代码 认真做作业。
具体操作提示:对于循环处理,可以使用循环链表,或者使用模,即取余数做循环。
c如何选择孙悟空的题目? 一群猴子想选一个新的猴王。新猴王的选拔方法是:让m只候选猴子围成一个圈,从某个位置开始编号到1 ~ M,从1号开始报数,每轮从1号开始向N报数。向N汇报的猴子退出圈子,然后从隔壁的下一只猴子开始重新报数。在这个循环中,最后剩下的猴子被选为猴王。请问哪只猴子当选猴王了?
想法一:
用数组int n[M],全部初始化为1,消去的标记为0,重复运算,留下最后一个数组元素1的下标1作为答案。
参考代码:
#包括iostream
使用命名空间std
int whoIsMonkeyKing(int,int);
int main()
{
coutthoismonkeyking(21,3)endl;
返回0;
}
Int whois猴王(int m,int n)//m是猴子的数量,n是最大报告数量。
{
if(m1 || n1)
{
Cout“输入参数错误”endl
return-1;
}
int * p = new int[m];
int *q = p,M = m
int res
for(int I = 0;im;我)
{
p[I]= 1;
}
而(M!=1)
{
int I = 0;
而(我!=n)
{
如果(q==p m)
{
q = p;
}
如果(*q ==1)
{
我;
}
}
*(q-1)= 0;
-M;
}
for(int I = 0;im;我)
{
如果(*(p i)==1)
{
RES = I 1;
打破;
}
其他
继续;
}
删除[]p;
返回res
}
求用数据结构(C语言版)写选孙悟空的程序, 一群猴子想选一个新的猴王。新猴王的选拔方法是:让N只候选猴子围成一个圈,从某个位置开始编号1~N。从1号开始报数,每轮从1号开始向3号报数。任何向3号报告的猴子都会退出圈子,然后从隔壁的下一只猴子开始同样的报数。在这个循环中,最后剩下的猴子被选为猴王。请问哪只猴子当选猴王了?
这是最基本的约瑟夫环。
可以通过数组或者链表来实现。
该阵列的实现方式如下:
# includestdio.h
#定义最大值1005
int main(void){
int monkey[MAX]= { 0 };
int n,temp = 0;
int monkey out = 0;
int count = 0;
scanf("%d ",n);
做{
温度;//逐一枚举圆内所有位置。
中频(温度)
temp = 1;//数组模拟一个环,最后一个与第一个相连。
如果(!猴子[临时])
数数;//t位会有人报数。
其他
继续;
If(count==3){//当前报表的编号为count。
count = 0;//计数器被清除
monkey[temp]= 1;//这只猴子已经退出,状态设置为1,表示已经退出。
恶作剧;//退出猴子数量增加一个。
}
}while((monkeyOut 1)!= n);
int I;
for(I = 1;I = n;i){
如果(!猴子[我]{
printf("%d\n ",I);
打破;}
}
返回0;
}
C语言编写的约瑟夫问题(猴子选国王)求神看看哪里错了。 for(k = 0;kn;k ){
if(sz[k]==1){
s = S1;
if(s==m){
sz[k]=0,s=0,b = B1;}}
if (k==n-1){
k = 0;}
if(b = = n-1){ break;}
}
更改为:
k = 0;
而(bn-1)
{
if(sz[k]==1)
{
s = S1;
if(s = = m){ SZ[k]= 0;s = 0;b = B1;}
}
k;
if(k = = n-1){ k = 0;}
}
最后更新于 2023-10-11 09:36:44 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章