约瑟夫问题,不定人数围成一个圈,当报的M时,该人出列,重新报数,问出列人编号

约瑟夫问题(数组篇)

最近招聘看到很多同学碰到一道题目,n个人围成一圈,从第一个开始报数,当报的M时,该人出列,问最后出列的人的原始编号为多少,这是约瑟夫问题,问题的来历你们自己去搜,我用java写了个例子,下面我们来解释一下
我这给的是20个人报到3出列

代码

public class test11 {
	//约瑟夫问题   
	static int  a []=new int[20];   //创建一个数组给定每个人的原始序号
	static boolean b[]=new boolean[20];  // 创建一个布尔数组给每个人一个初始状态 
	static int num=1;    //  报数的数初始值
	static void init(int a[],int num){
	for(int i=0;i<a.length;i++){
			a[i]=i+1;
			}     //初始化数组给定数组编号
			int i=0;        //给数组下标 
		while(true){
			if(i==a.length-1){
				i=-1;       
			}else{
				i++;      //每次循环i+1
				  每次循环num+1
				if(b[i]==true){     //开始判断检测  
					continue;       //如果b[i]  已经出列 就跳过
				}else{
					num++;
					if(num==3){    //如果没有    当计数到达3的时候
						num=0;       //清零
					b[i]=true;			//把当前编号的状态改为true    
					System.out.print(a[i]+" && ");   //打印出列编号
				}
			}
		}
		}		
		
}
	public static void main(String[] args) 
	{
		init(a, num);
			
	}
	
			
				
}
}

结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值