约瑟夫环(数组解决)

约瑟夫环问题是一个很经典的问题:一个圈共有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;
		
		}




	}
}

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值