约瑟夫环问题是一个很经典的问题:一个圈共有N个人(N为不确定的数字),第一个人的编号为0或者1(两个都可以,看你的程序如何编写),假设这边我将第一个人的编号设置为1号,那么第二个人的编号就为2号,第三个人的编号就为3号,第N个人的编号就为N号,现在提供一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人出局,直到N个人全部出局,请问,这个出局的顺序是什么? ?
如果不用数据结构的循环链表,用数组来实现,代码如下:
#include <iostream>
using namespace std;
int main() {
int N, K;
cin >> N >> K; //N表示输入人数,k表示第几个数该出列
int outcount = K, human = N;
int count = 0, m = 0;
int *match = new int[N]; //数组match用来表示该数是否已经出列
for (int i = 0; i < N; i++) {
match[i] = 1; //初始化全部未出列的数为1
}
while (human) {
for (int j = m; j < N; j++) {
if (match[j] == 1)count++; //当未出列则count++
if (count == outcount) { //当循环到该出列的数
match[j] = -1; //match[j]赋值为-1,表示已经出列
cout << j + 1 << " "; //因为从0开始,所以输出应为j+1
human--;
count = 0; //重新赋值count为0
}
if (j == N - 1)m = 0;
}
}
}
|