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 }
原文地址:https://www.cnblogs.com/scwyqin/p/12334162.html
时间: 2024-10-12 16:49:18