猴子选大王
题目描述
N只猴子选大王,选举方法如下:从头到尾1、2、3报数,凡报3的退出,余下从尾到头1、2、3报数,凡报道3退出;余下的从头到尾报数,还是报3的退出;依此类推,当剩下的两只猴子时,取这时报数报的1的为王。若想当猴子,请问当初应占据什么位置?
输入
一个正整数n,(n<=100),n为-1结束。
输出
1-n应占据的位置。
样例输入
10
23
-1
样例输出
8
14
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int a[1010],i,j,k,m=0,t;
if(n==-1)
break;
if(n==1)
printf("%d\n",n); //特判
for(i=0;i<n;i++)
a[i]=i+1;
for(i=0;i<n;i++)
{
if(m==n-2)//当还剩下两只猴子时,选大王
{
if(i%2==0)//顺着报数
for(j=0;j<n;j++)
if(a[j]!=-1)
{
printf("%d\n",a[j]);
break;
}
if(i%2==1)//逆着报数
for(j=n-1;j>=0;j--)
if(a[j]!=-1)
{
printf("%d\n",a[j]);
break;
}
break;
}
if(i%2==0)//顺着报数
{
t=0;//标记
for(j=0;j<n;j++)
{
if(a[j]!=-1)
{
t++;
if(t==3)
{
t=0;
a[j]=-1;//退出
m++;//退出了几个
}
}
}
}
if(i%2==1)//逆着报数
{
t=0;//标记报数
for(j=n-1;j>=0;j--)
{
if(a[j]!=-1)
{
t++;
if(t==3)//报了3
{
a[j]=-1;
t=0;//初始化为0
m++;//退出的人数+1
}
}
}
}
}
}
}