一、题目
N人围成一个环,每个人一个编号1—n,然后1、2报数,报2出局,其余人继续,直至最后一人。求该人的编号。
二、分析
我们可以用一个一维数组去储存,下标表示编号(0号不用),然后数组值全部赋值为0,报到2者数组值改为1,一直持续,直至最后一个0.
三、算法实现
(主要代码)
int a[1001]={
0,};
int flag,n,k,x,i=1;
while(scanf("%d",&n)!=EOF)
{
if(1==n||2==n)
x=1;
else{
for(i=1;i<=1000;i++)
a[i]=0;
flag=1;//flag模拟报数
for(k=0;k<=log2(n);k++)//log2(n)趟。
for(i=1;i<=n;i++)
{
if(a[i]!=-1)
{
if(flag==2)
{
a[i]=-1;
flag=0;
}
flag++;
}
}
for(i=1;i<=n;i=i+2)
if(a[i]!=-1)
x=i;
}
printf("%d\n",x);
}
四、算法分析
时间复杂度:根据循环的层数以及循环的变量,可以计算出其时间复杂度为nlogn。
空间复杂度除了一个一维数组为算法本需求身外,只有几个变量。故其空间复杂度为O(1)。
五、小结
此题实际模拟即可,较为简单,但是还是应该注意一些细节,比如走多少趟。