约瑟夫环问题
约瑟夫环是这样的描述:有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号位置,对所有的人重新编号。

浙公网安备 33010602011771号