约瑟夫环问题---C语言

问题描述:
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。

算法设计与分析
可用数组来解决这个约瑟夫环问题,即从第1开始数,从数组下标为0开始,移动数组下标,当数到m时,输出此时的数组元素下标,并且将此数组元素赋值为0,当数到数组的最后一个元素后,继续从数组下标为0处接下去,让数组形成一个循环,当判断到某个数组元素为0时,不计数,直到下一个数组元素不为0。

#include
int main()
{
	int a[200],n,m,i=1,j=0,p=1;
	printf("请输入人的个数n与初始密码m\n");
	scanf("%d %d",&n,&m);
	printf("请依次输入%d个密码\n",n);
	for(int x=0;x<n;x++)
    scanf("%d",&a[x]);
	while(p<=n)
	{
		if(i==m)              //判断是否报数到m
		{ 	
			m=a[j];             
			printf("%d ",j+1);
			++p;
			a[j]=0;           //把数组元素赋值为0,后面用来条件判断
			i=0;              //新一轮报数
		}
    	++j;                  
		if(j>=n)
			j=0;              //形成循环
		if(a[j]!=0)
			++i;             
	}
	return  0;
}


运行结果:
约瑟夫环问题---C语言_第1张图片


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