我是靠谱客的博主 动人大雁,这篇文章主要介绍已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直至杀掉所有人,当剩下,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

淘汰人

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

最后

以上就是动人大雁最近收集整理的关于已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直至杀掉所有人,当剩下的全部内容,更多相关已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部