约瑟夫环问题

约瑟夫环是这样的描述:有n个孩子围坐成一圈,编号为0~n-1。现在让这些孩子报数,从0~m-1依次报数。报到m-1的孩子退出圈。求最后留在圈里的孩子。

下面直接看这个问题的数学解法:

上面的数学推到已经完成了,所以代码实现:

 

//n代表有多少人在玩这个游戏
//m代表报数的范围是0~m-1
int LastRemaining_Solution(unsigned int n, unsigned int m)
{
	if(n == 0)
	{
		return -1;
	}
	
	int s = 0;
	if(n == 1)
	{
		return s;
	}
	
	for(int i = 2; i <= n; i++)
	{
		s = (s + m) % i;
	}
	
	return s;
}

注意这种算法中每个人的编号不是一成不变的,每淘汰一个人,都要把这个人的下一个人当成是0号位置,对所有的人重新编号。

posted @ 2015-10-16 12:05  stemon  阅读(287)  评论(0编辑  收藏  举报