猴子选大王

来源:互联网 发布:手机淘宝店招尺寸多少 编辑:程序博客网 时间:2024/05/16 15:54

任务:一群猴子按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;}
0 0
原创粉丝点击