A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在入学考试中有这么一道题:有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?

按我的理解来说,因为每当报到第14个人的时候就要退出,下一个人要从1开始报起,也就是说当剩下的人数不够14人的时候,游戏就结束了
可是我看了下别人的答案,他们说最后只剩下一个人,这让我百思不得其解, 而且说那个人是第92个人。
我的答案的是最后还剩下13个人,这13个人分别是:
第16个人、第29个人、第36个人、第39个人、第47个人、第55个人、第72个人、第74个人、第75个人、第80个人、第90个人、第91个人、第92个人

跟其他人的答案完全不一样,不知道是不是我写错了,下面是我的代码,请大家帮我分析一下,如果有误,请告诉我为什么,谢谢。
  1. package com.itheima;

  2. import java.util.ArrayList;
  3. /**
  4. * 第十题 :有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
  5. * 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
  6. */

  7. public class Test10 {

  8.         public static void main(String[] args) {
  9.                
  10.                 ArrayList<String> list = new ArrayList<String>();
  11.                
  12.                 //加载100个人进入集合中
  13.                 for(int i=1; i<=100; i++) {
  14.                         list.add("第" + i + "个人");
  15.                 }
  16.                
  17.                 System.out.println("人数是" + list.size());
  18.                
  19.                 int num = 0; //记录退出的人的位置
  20.                 //写个循环,开始报数,从1~100
  21.                 for(int i=1; i<=list.size();i++ ) {
  22.                        
  23.                         if(i == 14) {   //当报到第14人的时候,该人退出
  24.                                
  25.                                 num = num + (i-1);   //记录该人的位置
  26.                                
  27.                                 if(num >= list.size()) { //如果记录的位置数大于集合的长度
  28.                                        
  29.                                         num = num - list.size(); //位置 - 长度                       
  30.                                        
  31.                                 }
  32.                                 //打印是谁退出了
  33.                                 System.out.println(list.get(num)+"退出" + "目前人数是" + list.size());
  34.                                
  35.                                 list.remove(num);
  36.                                
  37.                                 i=1;  //再从1开始报数
  38.                         }
  39.                        
  40.                         if(i>=list.size()){
  41.                                 System.out.println();
  42.                         }
  43.                 }
  44.                
  45.                 System.out.println("最终剩下的人数有 : " + list.size() + "个人");
  46.                 System.out.println("这些人分别是:");
  47.                
  48.                 //打印剩下的人
  49.                 for(String man : list){
  50.                         System.out.println(man);
  51.                 }
  52.         }
  53. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

8 个回复

倒序浏览

import java.util.ArrayList;
       
        /**
         * @param args
         */

public class Test10 {

        public static void main(String[] args) {
                int LuckyPerson = getLucklyPerson(100);
                System.out.println("最后剩下的是第"+LuckyPerson+"个人");

        }

        public static int getLucklyPerson(int num) {
                ArrayList<Integer> list = new ArrayList<Integer>();//创建一个集合将数字作为人存入集合中.
                for (int i = 1; i <= num; i++) {
                        list.add(i);
                }
                int count = 1;
                for (int i = 0; list.size() != 1; i++) {//遍历集合中的数字,如果数到num时重新从0角标开始数,直至集合中的数字仅有1个.
                        if (i == list.size())
                                i = 0;
                        if (count % 14 == 0)   // 数到14时 次角标对应的数字移去,角标需后退一个,不然会出现角标越界异常
                                list.remove(i--);

                        count++;
                }
                return list.get(0); //返回最后一个数字.
        }
}

又是杀人环   楼主自己看
回复 使用道具 举报
我感觉你对题意的理解有误。“也就是说当剩下的人数不够14人的时候,游戏就结束了”这句话不对,当只剩下13个人时游戏会继续进行,直到只剩下一个人为止!
回复 使用道具 举报
chudaming213 发表于 2014-11-13 17:07
我感觉你对题意的理解有误。“也就是说当剩下的人数不够14人的时候,游戏就结束了”这句话不对,当只剩下13 ...

恩,后来我反映过来了,是我搭错线了
回复 使用道具 举报
本帖最后由 javaAndroid 于 2014-11-13 19:40 编辑
  1. /**
  2. * @Description 多人报数,报到指定数字就退出的问题的解决
  3. * @param nums        报数的人数
  4. * @param key        要退出的数字
  5. * @return        最后剩下的人的编号
  6. */
  7. private static int getLastPerson(int nums, int key) {
  8.         // 一个集合,模拟人数
  9.         List<Integer> list = new ArrayList<Integer>();
  10.         for (int i = 1; i <= nums; i++) {
  11.                 list.add(i);
  12.         }
  13.         int count = 0;        // 计数器
  14.         int index = 0;        // 当前报数的人的索引
  15.         while (list.size() > 1) {
  16.                 count++;        // 每报一个人,计数器+1
  17.                 if (index == list.size()) {
  18.                         index = 0;        // 如果当前索引等于了人数,则从头开始
  19.                 }
  20.                 if (count == key) {
  21.                         count = 0;        //报到了指定数字,则计数器置为0,并移除当前报数的人。
  22.                         list.remove(index);
  23.                         index--;        // list移除后,后续元素会依次前移,所以index要-1。
  24.                 }
  25.                 index++;        // 报一个人,往后移动一个位置,表示下一个人报数。
  26.         }
  27.         // list大小为1的时候就结束循环,返回第0个元素,即剩下的人编号。
  28.         return list.get(0);
  29. }
复制代码

回复 使用道具 举报
kang3214 来自手机 中级黑马 2014-11-13 20:39:14
地板
用循环数组就可以了,当数组下标大于或等于100,下标赋为0;
回复 使用道具 举报
DamonZh 中级黑马 2014-11-13 23:01:34
7#
  1. import java.util.ArrayList;

  2. class Num
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 ArrayList<String> al = new ArrayList<String>();

  7.                 for(int i = 1; i <= 100; i++){
  8.                         al.add("第" + i + "个人");
  9.                 }

  10.                 int count = 0;
  11.                 while(al.size() != 1){
  12.                         for(int j = 1; j <= 14; j++){
  13.                                 if(j == 14){
  14.                                         al.remove(count);
  15.                                         count--;
  16.                                 }
  17.                                 if(count >= al.size() - 1)
  18.                                         count = 0;
  19.                                 else
  20.                                         count++;
  21.                                
  22.                         }
  23.                 }
  24.                         System.out.print(al.get(0));
  25.         }
  26. }
  27. //第92个人吧
复制代码


回复 使用道具 举报
赞!。。。。
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马