一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
思想:使用循环链表建立约瑟夫环来实现,过程比较清晰。
#include <iostream>
#include <cstdio>
using namespace std;
typedef struct node{
int num;
struct node *next;
node()//初始化
{
num=0;
next=NULL;
}
}*Link;
Link create(Link L,int n)//建表
{
L=new node();
Link p,q;
p=L;
int i=1;
while(i<=n)
{
q=new node();
q->num=i;
p->next=q;
p=q;
i++;
}
p->next=L->next;//建立循环链表
return p;
}
void caculate(Link L,int n)//计算
{
L=create(L,n);
Link p,q;
p=L->next;
int num=0,i=n;
while(p->next->num!=1)
p=p->next;
while(i>1)//一共删除掉n-1的元素,保留下一个用做输出
{
while(num<2)
{
num++;
p=p->next;
}
q=p->next;//指针保留
p->next=q->next;//删除出列的元素
num=0;
i--;
if(i==1)
break;
}
cout<<p->num;
}
int main()
{
int n;
cin>>n;
Link L;
caculate(L,n);
return 0;
}