约瑟夫环类问题
n个人围成一个圈,从1开始对n个人编号,现在从1号开始报数,报到m的人出圈,之后从出圈后一位的人开始报数,重复直到所有人出圈,请按序输出出圈的人的编号
https://www.bilibili.com/video/BV1so4y1o7KJ?p 法一: #include<iostream> using namespace std; const int N = 110; int a[N]; int main() { int n, m; cin >> n >> m; int cnt = 0, i = 0, k = 0; while (cnt != n) { ++i; if (i > n) i = 1; if (a[i] == 0) { ++k; if (k == m) { a[i] = 1; ++cnt; cout << i << ' '; k = 0; } } } return 0; } 法二: #include<iostream> using namespace std; int ysf(int n, int k, int i) //表示由n个人,报到数字k时出局,第i个出局的人的编号 { if (i == 1) { return (k - 1 + n) % n; } else { return (ysf(n - 1, k, i - 1) + k) % n; } } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; ++i) { cout << ysf(n, m, i) + 1 << ' '; } return 0; }