N个人围成圈报数(经典例题约瑟夫环)

/*
* n个人(编号1~n)围成一圈从编号为1的开始报数,从1报数到m,报到m的人出来,
* 下一个人继续重新从1开始报数,编程求最后一个留下的人的编号;
* 如n=3,m=4;
* 第一次出队:1;
* 第二次出队:3;
* 最后留下:2;
*/

> 解题思路:通过boolean数组,true与false的关系巧妙解决

  • 代码如下:
public static void main(String[] args) {
     		
		
		Scanner sr=new Scanner(System.in);
		int n=sr.nextInt();
		int m=sr.nextInt();
		
		//int n=3;	int m=4;	//用于测试
				
		//调用
		BaoShu(n, m);
				
	}
	//封装一个方法
	public static void BaoShu(int n,int m) {
     
		
		//首先定义一个boolean数组,让它的长度为n(编号1~n),值为true;		
		boolean[] bln=new boolean[n];
		
		for (int i = 0; i < bln.length; i++) {
     
			bln[i]=true;
		}
		//初始化两个变量,count用来计数,chang等于数组的长度;
		int count=0; int chang=bln.length;
		//这里用while循环,判断长度大于1的情况运行,小于等于1就会自动停止循环;
		while(chang>1) {
     
			//遍历数组从第一个开始计数;
			for (int i = 0; i < bln.length; i++) {
     
				
				if(bln[i]) {
     
					count++;	//每次判断+1;
					
					if(count==m) {
     	//当计数等于m时,计数清零继续从当前位置进行数数;
						count=0;
						bln[i]=false;	//让等于m的数值为false,并长度减一;
						chang--;
					}
				}
			}
		}
		//遍历数组,判断为true的数值,输出其位置,也就是数组的下角标((下角标从0开始的,所有要加一)
		for (int i = 0; i < bln.length; i++) {
     
			if(bln[i]) {
     
				System.out.println("最后一个人留下的编号是:"+(i+1)+"号");
			}
		}		
	}

你可能感兴趣的:(java算法基础,java)