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;
}
京公网安备 11010502036488号