孩子们的游戏(圆圈中最后剩下的数)
C++,数学题。
真的是一道纯粹的数学题。
网上的解析都是推公式,我这里给出一个例子说明。。。
为了保证排版不乱,例子放在代码块里。
n = 6, m = 3
第4行的数字表示序号,以下先模拟一遍过程
0 1 2 3 4 5
0 1 2 3 4 5
3 4 5 0 1
0 1 3 4
4 0 1
4 0
0 ----所以0就是答案,过程很简单
同样,第13行表示序号,i是剩余孩子的数量,a是目标数0的序号值
以下过程一定要从下往上看!!!!
0 1 2 3 4 5 i a
0 1 2 3 4 5 6 0 = (3 + 3) % 6 -----最终答案,得出规律ans = (ans + m) % i
3 4 5 0 1 5 3 = (0 + 3) % 5
0 1 3 4 4 0 = (1 + 3) % 4
4 0 1 3 1 = (1 + 3) % 3
4 0 2 1 = (0 + 3) % 2
0 1 0 = 0
代码放下面:
class Solution {
public:
int LastRemaining_Solution(int n, int m) {
if (!n) return -1;
int ans = 0;
for (int i = 2; i <= n; i++)
ans = (ans + m) % i;
return ans;
}
};