假设有n个人(0<n <20)围成一圈,按顺序每人分配一个编号(1,2,3,4,..,n,后续活动中每个人分配的此编号始终不变。
现在,从编号为1的人开始、按编任从小到大顺序方向,从1开始报号,
即报号规则为1、2、3.…,报到m(O <m <20)的人出列,剩下的人仍组成一圈。
然后从下一个人开始,又从1开始报号,报到m的人出列。依此类推,直到所有人出列。
输出依次出列的人编号序列。
例如:5个人围成一圈,报到3的人出列,即n=5. m=3.则依次出列的编号序列为:3 1 5 2 4
格式要求
输入:scanf("%d%d" ,&n, &m)输出:
(1)如果输入不符台要求,则printf("ERROR")(2)每个出列人的编号输出格式为:printf("It%d"",i)
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是一个基于 C++ 的约瑟夫环问题的解决方案:
#include<iostream>
using namespace std;
int main()
{
int n, m, i, j;
bool *p;
cin >> n >> m;
if(n <= 0 || n >= 20 || m <= 0 || m >= 20) {
cout << "ERROR" << endl;
return 0;
}
p = new bool[n];
for(i = 0; i < n; i++) p[i] = true;
i = -1; j = 0;
while(j < n) {
int k = 0;
while(k < m) {
i = (i + 1) % n;
if(p[i]) k++;
}
cout << "It" << i + 1 << endl;
p[i] = false;
j++;
}
delete[] p;
return 0;
}
该程序首先接受用户输入的 n 和 m,其中 n 为人数,m 为报数到 m 的人出列。然后,它根据输入的 n 动态分配一个 bool 类型的数组 p,用于记录每个人是否还在圈内,初始化为 true。接下来,程序进入循环,直到所有人都出列。在循环中,程序首先从上一个出列的人的下一个人开始报数,当报数到 m 时,该人出列,将其在数组 p 中的值修改为 false,同时输出该人的编号。最后,程序输出所有人的编号后,释放数组 p 的内存。
希望这个程序能帮助您解决约瑟夫环问题。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢