猴王问题

首先用一个数组来存放猴子的编号,从1到m,然后按题目要求,用循环来实现猴子大王的选举

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;   //定义数据元素类型
typedef struct CNode
{
	ElemType data;
	struct CNode *next;
}CNode;
CNode *monkey;          //定义一个全局变量
Status Create_clist(CNode *clist,int n)    //创建一个有n个节点的环形链表
{
	CNode *p,*q,*head;
	int i;
	clist =NULL;
	for (i=n;i>=1;i--)
	{
		p=(CNode *)malloc(sizeof(CNode));
		p->data=n;
		p->next=NULL;
		head=p;
		if (p==NULL)
			return OVERFLOW;     //存储分配失败
		p->data=i;
		p->next=clist;
		clist=p;
		if (i==n)
			q=p;              //用q指向链表的最后一个结点
	}
	q->next=clist;          //把链表的最后一个节点的链域指向链表的第一个结点,构成循环链表
	monkey=clist;           //把创建好的循环链表头指针赋给全局变量
	return OK;
}
Status Monkey(CNode *clist,int n)
{
	int i;
	int m;
	CNode *p,*q;
	if (!Create_clist(clist,n))
		return ERROR;             //起始位置错
	p=monkey;                     //p指向创建好的循环链表
	for (m=13;n>1;m--,n--)
	{
		if (m==1)
		{
			m=13;
		}
		for (i=0;i<m-1;i++)       //找出第m-1个结点
			p=p->next;            //删除p->next结点
		q=p->next;
		p->next=q->next;
		p=p->next;
		free(q);
	}
	printf("%d ",p->data);         //输出应出列的结点
	clist=NULL;                    //删除最后一个结点
	return OK;
}
int main()
{
	int n;
	CNode *clist;
	clist=NULL;                      //初始化clist
	printf("\n请输入猴的个数n:\n");
	scanf("%d",&n);
	Create_clist(clist,n);            //创建一个有n个结点的循环链表clist
	printf("\n猴王是:\n");
	Monkey(clist,n);
	return 0;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
猴王游戏是一个古老的数学问题,也被称为约瑟夫问题。在PHP中,可以使用一个数组来模拟这个游戏。 首先,我们需要定义一个包含所有参与游戏的人的数组,然后定义一个计数器,用来记录当前报数的人的位置。接下来,我们以以下步骤重复进行,直到只剩下最后一个人: 1. 从计数器指向的位置开始,数到第m个人,将其从数组中删除。 2. 将计数器加1,从下一个位置开始重新数数,重复第1步。 最后,剩下的那个人就是猴王。 下面是一个实现猴王游戏的PHP代码: ```php function findMonkeyKing($n, $m) { $arr = range(1, $n); $count = 0; while (count($arr) > 1) { $count++; $head = array_shift($arr); // 取出队首元素 if ($count % $m != 0) { array_push($arr, $head); // 如果不是第m个人,则把队首元素放到队尾 } } return $arr[0]; } $n = 10; // 参与游戏的人数 $m = 3; // 报数到第m个人出列 $monkeyKing = findMonkeyKing($n, $m); echo "The monkey king is No.{$monkeyKing}.\n"; ``` 在上面的代码中,我们定义了一个findMonkeyKing()函数,它接受两个参数:参与游戏的人数$n和报数到第几个人出列$m。函数内部使用一个while循环来模拟猴王游戏的过程,直到只剩下最后一个人。在每一轮循环中,我们从数组中取出队首元素,如果这个元素不是第m个人,就将它放回到队尾。如果这个元素是第m个人,就将它从数组中删除。最后,当数组中只剩下一个元素时,返回这个元素的值,即为猴王的编号。 在示例中,我们将$n设为10,$m设为3,表示有10个人参与游戏,每报数到第3个人就出列。最后输出猴王的编号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值