题目描述
n 个人围成一圈, 并依次编号1~n,。从编号为1 的人开始,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(设3<=n<=50)
输入
有多个测试序列。每行是开始时的人数n
输出
第1 行是选出顺序,第2 行是两名幸运儿的开始位置(按升序排列),位置编号之间用一个空格分开。
样例输入
12
20
45
样例输出
2 4 6 8 10 12 3 7 11 5
1 9
2 4 6 8 10 12 14 16 18 20 3 7 11 15 19 5 13 9
1 17
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 3 7 11 15 19 23 27 31 35 39 43 5 13 21 29 37 45 9 25 41 17
1 33
思路:根据题意,选到最后肯定会剩下两个人,所以就以此作为突破口。一边挑选一边用x来统计选出去的人数,当选出去的人数x=n-2时,选择结束,剩下来的两个人就是幸运儿。由于不知道在挑选到哪个位置时会剩下两个人,所以在每次挑选的过程中都进行判断(即x是否等于n-2),一旦x==n-2的话,就要输出那两个幸运儿的位置。而选出顺序的输出是在选择的过程中完成的,一边选择一边输出。
}
if(w1)
contin#include<stdio.h>
int main()
{
int n,i,y,x,w;
while(scanf("%d",&n)!=EOF)
{
w=0;
x=0;
int a[n];
for(i=1;i<=n;i++)
{
a[i]=i;
}
for(y=2;y<=n;y=y+2)
{
a[y]=0;
if(y2)
printf("%d",y);
else
printf(" %d",y);
x++;
if(xn-2)
{
w=1;
printf("\n");
for(i=1;i<=n;i++)
{
if(a[i]!=0&&i1)
printf("%d",a[i]);
if(a[i]!=0&&i!=1)
printf(" %d\n",a[i]);
}
}
}
if(w1)
continue;
for(y=3;y<=n;y=y+4)
{
a[y]=0;
printf(" %d",y);
x++;
if(xn-2)
{
w=1;
printf("\n");
for(i=1;i<=n;i++)
{
if(a[i]!=0&&i1)
printf("%d",a[i]);
if(a[i]!=0&&i!=1)
printf(" %d\n",a[i]);
}
}
}
if(w1)
continue;
for(y=5;y<=n;y=y+8)
{
a[y]=0;
printf(" %d",y);
x++;
if(xn-2)
{
w=1;
printf("\n");
for(i=1;i<=n;i++)
{
if(a[i]!=0&&i1)
printf("%d",a[i]);
if(a[i]!=0&&i!=1)
printf(" %d\n",a[i]);
}
}
}
if(w1)
continue;
for(y=9;y<=n;y=y+16)
{
a[y]=0;
printf(" %d",y);
x++;
if(xn-2)
{
w=1;
printf("\n");
for(i=1;i<=n;i++)
{
if(a[i]!=0&&i1)
printf("%d",a[i]);
if(a[i]!=0&&i!=1)
printf(" %d\n",a[i]);
}
}
}
if(w1)
continue;
for(y=17;y<=n;y=y+32)
{
a[y]=0;
printf(" %d",y);
x++;
if(xn-2)
{
w=1;
printf("\n");
for(i=1;i<=n;i++)
{
if(a[i]!=0&&i1)
printf("%d",a[i]);
if(a[i]!=0&&i!=1)
printf(" %d\n",a[i]);
}
}ue;
}
}