java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

 1 /*37 【程序 37 报数】 
 2 题目:有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,
 3 问最后留下的是原来第几号的那位。 
 4 */
 5 
 6 /*分析1====错误分析,没有注意到要退出圈子!!!
 7  * 1、用一个数组存放n个1,从头开始报数
 8  * 2、声明一个计数器,报数为3时,数组中的数赋为0,计数器重置
 9  * 3、一直直到还剩下最后一个不为0的数,这个数的角标加1就是原来的几号
10  * 
11  * 分析2:----利用ArrayList,淘汰的人直接退出
12  * 1、存放1-n至一个表中,
13  * 2、报到3的直接淘汰(对3取余)
14  * 3、剩下一个人时,游戏结束,它自己的编号就是最开始的序号
15  * */
16 
17 
18 
19 package homework;
20 
21 import java.util.LinkedList;
22 import java.util.List;
23 import java.util.Scanner;
24 
25 public class _37 {
26 
27     public static void main(String[] args) {
28         //从键盘得到参与游戏的总人数n
29         System.out.println("请输入围圈总人数:");
30         Scanner sc= new Scanner(System.in);   //扫描仪
31         int n = sc.nextInt();   //得到n
32         sc.close();   //关闭扫描仪
33         System.out.println("最后留下的是原来的:"+game(n)+"号");
34         
35     }
36     
37     //游戏进行函数
38     public static int game(int n) {
39         int counter=3;
40          List<Integer> list = new LinkedList<>();
41             for (int i = 1; i <=n ; i++) list.add(i);//循环赋值初始位置。从1开始。
42             int index = -1; //下标从0开始 , 初始化为-1;
43             while (list.size() > 1) {
44                 index = (index + counter) % list.size(); //对总数取余。 index+key,表示每次数key(3)个数
45                 list.remove(index--);//把当前元素删除,然后下标-1.
46             }
47             return list.get(0);//返回最后一个元素原来的序号。
48         }
49     
50 
51 }

 

posted @ 2020-02-20 01:40  浪漫主义程序员  阅读(996)  评论(0编辑  收藏  举报