约瑟夫环问题的算法模块

问题描述:
/*约瑟夫入狱,监狱内共有33个犯人。
 * 某日x名犯人围成一圈,从第m个犯人开始报数,
 * 报到数字y的犯人出列,被枪毙,下一名犯人重新从1开始报数。
 * 依次类推,直至剩下最后1名犯人可被赦免。
 * 聪明的约瑟夫在心里稍加计算,算出了最后枪毙的位置,
 * 他站在这个位置,最终避免了自己被枪毙,逃出升天。
 * 问:约瑟夫算出的是哪个位置?
*/

#include<stdio.h>
#define N 1000
int main()
{
    int a[N]={0},n=0,i,j=1,m,x,y;
    printf("请输入第一个人位置和总人数:\n");
    scanf("%d%d",&m,&x);
    printf("请输入逢几一杀:\n");
    scanf("%d",&y);
    while(1)                   /* 将所有人员按枪毙顺序排号*/
    {
        for(i=m;i<x+1;i++)
        {
            if(a[i]==0)       /*如果该名犯人i没有被枪杀过,
                                对其赋值j(表示其被枪杀的顺序)
                                               */
            {
                n++;
                if(n==y)
                {
                    a[i]=j++;
                    n=0;
                }
            }
        }
        m=1;
        if(j==x+1)
            for(i=1;i<x+1;i++)                /*选出大小等于x的元素,表示其最后被枪杀*/
                if(a[i]==x)
                {
                    printf("最后一个人是第%d号\n",i);
                    return 0;
                }
    }
}
posted @ 2016-07-08 15:30  长弓391  阅读(171)  评论(0编辑  收藏  举报