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 蓝桥杯 约瑟夫环的主要内容,如果未能解决你的问题,请参考以下文章