/*
N只猴子围成(一圈),顺时针方向从1到n编号。之后从1号开始顺时针方向让猴子从1到m依次报数,凡报到m的出圈,取消资格。下一位再从1开始依次报数,报出m者出圈,最后剩下的就是猴王。
*/
#include <iostream>
using namespace std;
typedef struct monkey //定义结构体
{
int num;
monkey *next;
}*head,*tail;
void create(int n)
{
int i;
monkey *p,*q;
p = new monkey; //p指针用来指向每次新创建的结点
p->num = 1;
p->next = NULL;
head = p;
q = p; //q指针为跟随指针
for (i = 2;i <= n;i = i+1)
{
p = new monkey;
p->num = i;
q->next = p;
q = p;
p->next = NULL;
}
tail = q;
tail->next = head;
}
void select(int m)
{
int x = 0;
monkey *p,*q;
q = tail;
do
{
p = q->next; //p指向第一个结点
x = x + 1;
if (x % m == 0) //找到要删除的结点
{
cout<<"被删除的猴子号为:"<<p->num<<endl;
q->next = p->next;
delete p;
p = NULL;
}
else
{
q = p;
}
} while (q != q->next);
head = q;
}
int main()
{
int n,m;
head = NULL;
cout<<"输入猴子的个数:";
cin>>n;
cout<<"输入间隔:";
cin>>m;
create(n);
select(m);
cout<<"猴王是:"<<head->num;
delete head;
system("pause");
return 0;
}
猴子选大王
最新推荐文章于 2024-08-29 18:13:18 发布