C语言求解 孩子们的游戏(圆圈中最后剩下的数字)
解题思路
约瑟夫环问题。使用迭代的思路进行,假如f(n,m)代表 n个人,步长为m,那么经历过第一轮后,剩下n-1个人,并且删除第m个人,起始位置为m。和f(n-1,m)作比较,也就是f(n,m)的一轮结果相比于 f(n-1,m), 只是起始位置右移了m位。而f(n,m)的第二轮,相比于f(n-1,m)的第一轮,元素位置肯定不变,所以只要计算位置和元素值的偏移即可。所以f(n,m)=(f(n-1,m)+m)%n,f(n-1,m)=(f(n-2,m)+m)%(n-2)由于f(1,m)=0,迭代进行 f(2,m)=(f(1,m)+m)%2
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @param m int整型
* @return int整型
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
int LastRemaining_Solution(int n, int m ) {
//约瑟夫环的问题,考虑f(n,m)代表n个人 m个数字 f(1,m)=0
//没有小朋友的情况
if(n == 0 || m == 0)
return -1;
int ans = 0;
//从小到大,更新x
for(int i = 2; i <= n; i++)
ans = (ans + m) % i;
return ans;
}