任务:一群猴子按1 ,2,3……m进行编号,这群猴子按照1-m的顺序围坐一圈,从1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:输入整数m,n(n < m)。中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。
思路: 开始的时候,我们创建一个数组,数组的下标表示猴子的编号,并且把它的下标当做他的初始值,它还有一个功能就是把已经报数的猴子标记为0,这里我们使用取模的方法来实现循环报数的功能,我们初始化一个num=0, num%m就是用来报数的,每报一个数,我们就把它标记为0,循环n-1次,最后剩的没被标记的猴子即被选做大王
代码:
1.顺序表
#include"stdio.h"
int main()
{
int n,m;
int monkey[100];
printf("请输入猴子数和最大报数\n");
while(scanf("%d%d",&n,&m)==2)
{
int ge = n;
for(int i=1;i<=n;i++)
{
monkey[i] = i;
}
int cur = 1,ccur=1;
int num = 0;
while(n-1)
{
if(monkey[ccur])
{
num++;
if(num%m==0)
{
monkey[ccur]=0;
n—; }
}
cur++;
ccur = (cur-1)%ge+1;
}
for(int i=1;i<=ge;i++)
{
if(monkey[i])
printf("猴子大王的编号是: %d\n",monkey[i]);
}
}
return 0;
}
2.链表
#include"stdio.h"
struct Ming{
int last,next;
};
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
Ming monkey[n+1];
for(int i=1;i<=n;i++)
{
monkey[i].last=i-1;
monkey[i].next=i+1;
}
monkey[1].last=n;
monkey[n].next=1;
int cur=1,num=0;
while(monkey[cur].next!=cur)
{
num++;
if(num%m==0)
{
monkey[monkey[cur].last].next=monkey[cur].next;
monkey[monkey[cur].next].last=monkey[cur].last;
}
cur=monkey[cur].next;
}
printf("%d\n",cur);
}
return 0;
}
通过顺序表和链表两种方式实现猴子大王算法,输入猴子数量和报数规则,输出最终的大王编号。
7030

被折叠的 条评论
为什么被折叠?



