java 蓝桥杯 约瑟夫环

Posted _jigr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 蓝桥杯 约瑟夫环相关的知识,希望对你有一定的参考价值。

约瑟夫环

问题描述
n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。(报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。求最后剩下的人的编号。这就是著名的约瑟夫环问题。本题目就是已知 n,k 的情况下,求最后剩下的人的编号。

题目的输入是一行,2个空格分开的整数n, k。
约定:0 < n,k < 1百万

要求输出一个整数,表示最后剩下的人的编号。

样例输入:

10 3

样例输出:

4

思路见代码及注释

import java.util.Scanner;

public class Main 
	static int out=0;//标记已被淘汰的人数
	public static void main(String[] args) 
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int k=sc.nextInt();
		//将n个人存储在数组中
		int[]arr=new int[n+1];
		for (int i = 1; i < arr.length; i++) arr[i]=i;
		//动态变化的索引,用于模拟循环报数
		int in=1;
		int ik=1;
		//当淘汰人数等于n-1时会跳出循环
		while (out<n-1) 
			//被置为0的视为已经被淘汰,所以碰到0和碰到非0的操作是不一样的
			if(arr[in]==0) 
				//已被淘汰 不需要报数
				if(in==n)in=1;else in++;
			else 
				if(ik==k) 
					arr[in]=0;//置为0(淘汰)
					ik=0;//报数从1开始,因为下面有K++ 所以置0
					out++;
				
				if(in==n)in=1;else in++;
				ik++;
			
		
		//这时候数组中肯定只剩一个人不为0了,那么这个人的序号就是最后的answer
		for (int i = 1; i < arr.length; i++) 
			if(arr[i]!=0) 
				System.out.println(arr[i]);
				break;
			
		
	

以上是关于java 蓝桥杯 约瑟夫环的主要内容,如果未能解决你的问题,请参考以下文章

小学生蓝桥杯Python闯关 | 约瑟夫环

蓝桥杯每日一题冲刺国赛

c数组指针的约瑟夫杯问题 初学者求助

约瑟夫环_java_数组

约瑟夫环(超好的代码存档)--19--约瑟夫环--LeetCode面试题62(圆圈最后剩下的数字)

约瑟夫环(超好的代码存档)--19--约瑟夫环--LeetCode面试题62(圆圈最后剩下的数字)