约瑟夫环可用取余实现循环!

看到很多人都习惯用循环列表来做约瑟夫环问题,作为一个新人理解起来确实困难,现提供一种易于理解的方法,仅供参考。
 


约瑟夫环(例题)
Description
有一次,明明的公司举行忘年会。忘年会的高潮部分是最后的抽大奖环节。公司为了增加活动的气氛,并没有按传统的抽奖方式来抽,而是进行了一个游戏:逐步逐步地淘汰人,而最后剩下的人,将会得到大奖。这个游戏的方式如下:首先公司的全部职员围成一个圈,然后确定一个淘汰数X,接着就从其中的一个人开始,从1数数,当数到X时,那个人就被淘汰出局,接着下一个人再从1开始数数,一直这样重复下去,直到剩下最后一个人,那个人就是最后的大奖得主。  例如,公司有5个人,淘汰数定为2,则一开始五个人排成一圈,依次编号为:1、2、3、4、5; 首先从编号1的人开始数数,数到2后,编号2淘汰,这样只剩下4个人:1、3、4、5; 接着从编号3的人开始数,数到2后,编号4淘汰,这样只剩下3个人:1,3、5; 接着从编号5的人开始数,数到2后,编号1淘汰,这样只剩下2个人:3、5; 最后从编号为5的人开始数,数到2后,编号5淘汰,最后编号为3的那个人就获得了最终的大奖。 (注:以上的淘汰顺序为2 4 1 5 3。)  由于明明的运气十分地差,最后第二个被淘汰,与大奖失之交臂,十分郁闷。他想知道自己被淘汰的全过程,于是他想请你帮个忙,帮他写一个程序,明明把他公司的人数告诉你,并且把那个淘汰数也告诉你,你的程序能够根据这两个数计算出淘汰人的具体顺序,即把淘汰人的编号按顺序输出。  明明的问题可以归结为:给你一个公司的人数N和一个淘汰数X,你的程序模拟上面描述的淘汰方式,输出淘汰人的编号顺序。 
The Input
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅一行,每组测试数据有两个整数N(1
#include 

int main(void)
{
    int ch[101] = {0};
    int n,x,i,count;
    while(scanf("%d %d",&n,&x) == 2)
    {
        count = 0;
        for(i = x;;i = (i+x)%n)
        {
            if(i == 0)
            i = n;
            ch[i] = 3;
            printf("%d",i);
            printf(" ");
            count++;
            if(count == n)
            printf("\n");
            if(count == n)
            break;
        }
    }
    return 0;
}

 

 

 

 

 

你可能感兴趣的:(算法)