约瑟夫环(数组解决)

约瑟夫环问题是一个很经典的问题:一个圈共有N个人(N为不确定的数字),第一个人的编号为0或者1(两个都可以,看你的程序如何编写),假设这边我将第一个人的编号设置为1号,那么第二个人的编号就为2号,第三个人的编号就为3号,第N个人的编号就为N号,现在提供一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人出局,直到N个人全部出局,请问,这个出局的顺序是什么?
 

如果不用数据结构的循环链表,用数组来实现,代码如下:

#include 
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;
		
		}




	}
}

你可能感兴趣的:(数据结构与算法,算法)