已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直至杀掉所有人,当剩下

本文介绍了一个关于约瑟夫环问题的Java实现方案。通过创建一个类Game,定义了一个名为fun的方法,该方法接收三个参数:总人数N、起始报数位置k和报数间隔m,并最终返回获胜者的原始编号。文章详细解释了如何模拟游戏过程,包括如何确定每次被淘汰的人及调整剩余人员的编号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class Game {
	public int fun(int N,int k,int m) {    //第k个人
		int[] array=new int[N];            //创建N个人
		int n=N;						   //剩余人数
		for(int i=0;i<array.length;i++) {  //让每个人拿着最初编号
			array[i]=i+1;                  
		}
		for(int i=0;i<N-1;i++) {           //淘汰N-1个人
			if(k==0) {                     
				k=(k+m)%n;	
			}else {
				k=(k+m-1)%n;
			}
			for(int j=k;k!=0&&j<n;j++) {   //一个人被淘汰,后面的补上来
				array[j-1]=array[j];
			}
			n--;
		}
		return array[0];
	}
	public static void main(String[] args) {
		System.out.println("获胜者编号为:"+new Game().fun(10,5,3));
	}
}

思路

有三个变量,所以创建有三个形参的函数;

创建N个人,每个人拿着自己的最初编码,获胜了就能得到最初编码了;

找到将要淘汰的人,把淘汰的人cut掉;

N个人要淘汰N-1个人,所以以上步骤进行N-1次循环;

返回获胜者编码

找到将要淘汰的人

从第k个人开始报数,数到m的人淘汰,下一个淘汰的也就是k+m-1;

从淘汰人的下一位开始报数,数到m的人淘汰,下一个淘汰的也就是k+m  //k为被淘汰的人

但是第k个人被淘汰了,原本为k+1的人就成了第k个,所以下一个淘汰的为k+m-1;

淘汰前:A    B    C    D    F               //k=3

              1    2     3    4    5

淘汰后:A    B    D    F                     //D的编号就为3了,从他开始报数,下个人为3+m-1

               1    2     3    4

有种特殊情况:当被淘汰的人为数组中最后一位是时,他的下一位的位置不会-1,所以下一个淘汰的也就是k+m

淘汰前:A    B    C    D    F               //k=5,k%=n    //n为人数

              1    2     3    4    5

淘汰后:A    B    C    D                     //从淘汰者的下一位开始报数也就是A,A的编号并没变,下个人为k+m

               1    2     3    4

淘汰人

只需把数组后面的移上来占掉位置就行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值