约瑟夫问题:有m个人 编号从1,2,...m进行编号 然后从编号为1的人开始报数1,2,..,n重复开始报数 报到n的人出局,求留到最后那个人的编号是多少

约瑟夫问题:有m个人 编号从1,2,…m进行编号 然后从编号为1的人开始报数1,2,…,n重复开始报数 报到n的人出局,求留到最后那个人的编号是多少

我在代码里写了很多注释,你肯定能看懂,就不赘述思路了。

代码:

#include
int main()
{
     
	int m,n;
	int i = 0;
	scanf("%d %d",&m,&n);
	int arr[m];
	for(i=0;i<m;i++)
	{
     
		arr[i] = 0;//0表示还活着
	}
	int outof = 0;//被杀掉的人
	int index = 0;//当前这个人的号码-1,当做数组下标,便与计算;
	int speaknum = 0;//当前报的数
	while(outof < m-1)//m-outof>1,两个条件是同一个意思,即活着人数大于1时,就会循环;
	{
     
		if(arr[index]==0)//还活着就报数
		{
     
			++speaknum;
			if(speaknum == n)//如果报到了这个数就杀掉
			{
     
				arr[index] = 1;//1代表被杀了
				++outof;//死掉的人+1
				speaknum = 0;//当前报数重新开始
			}
		}
		++index;//下一个人继续报数
		if(index >= m)//如果最后一个人报数结束,则从第一个人开始报数
		{
     
			index = 0;	
		}
	}
	
	for(i=0;i<m;i++)//打印出最后活下来的人的编号
	{
     
		if(arr[i]==0)
		{
     
			printf("活下来的是%d号\n",i+1);
		}
	}
	return 0;	
}

我代码是在Linux里用VI写的,在Windows里用c-free编译执行时,如果有中文输出的话,会出现乱码,把中文删除就好了;

你可能感兴趣的:(c语言,约瑟夫问题)