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;}

}

相关文章

发表新评论