约瑟夫环问题(幸运儿)

题目描述

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(y
2)
             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&&i
1)
                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(x
n-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(w
1)
         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&&i
1)
                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(x
n-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(w
1)
         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&&i
1)
                printf("%d",a[i]);
                if(a[i]!=0&&i!=1)
                printf(" %d\n",a[i]);
             }
              
            }ue;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44373494/article/details/90177555