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;
}