一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(\le≤1000)。
输出格式:
在一行中输出当选猴王的编号。
样例输入:
11
样例输出:
7
程序代码:
#include<iostream>
#include<malloc.h>
using namespace std;
struct node
{
int data;
struct node* next;
};
node* init(node* a,int n);
int main()
{
int n;
cin>>n;
node* l=(node*)malloc(sizeof(node));
l=init(l,n);
node* p =l;
/*while(p->next!=l)
{
cout<<p->data;
p=p->next;
}
cout<<p->data;*/
p=l;
int count = 0;
while(p->next!=p)
{
count++;
if(count==2)
{
node* temp;
temp = p->next;
p->next=p->next->next;
free(temp);
count = 0;
}
p=p->next;
}
cout<<p->data;
return 0;
}
node* init(node* a,int n)
{
a->next = NULL;
a->data= 1;
node* p=a;
if(n==1)
{ a->next=a;
return a;}
int i = 2;
node* s;
while(i<=n)
{
s= (node*)malloc(sizeof(node));
s->data = i;
s->next=NULL;
p->next=s;
p=p->next;
i++;
}
s->next = a;
return a;
}
运行结果: