猴子选大王

通过顺序表和链表两种方式实现猴子大王算法,输入猴子数量和报数规则,输出最终的大王编号。

任务:一群猴子按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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值