约瑟夫环问题的算法模块
问题描述:
/*约瑟夫入狱,监狱内共有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;
}
}
}