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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨道红 于 2014-1-19 22:34 编辑
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. /*
  4. * 有100个人围成一个圈,
  5. * 从1开始报数,报到14的这个人就要退出。
  6. * 然后其他人重新开始,
  7. * 从1报数,到14退出。
  8. * 问:最后剩下的是100人中的第几个人?
  9. */
  10. public class Test10 {

  11.         /**
  12.          * @param args
  13.          */
  14.         public static void main(String[] args) {
  15.                 // TODO Auto-generated method stub
  16.                 ArrayList<Integer> al = new ArrayList<Integer>();//新建一个集合,用于存储这100个人
  17.                 for(int i = 1; i<=100; i++)//给集合添加元素
  18.                         al.add(i);//添加到集合
  19.                 ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储每次退出的那个人
  20.                 newAl = getQuit();//通过调用getQuit()方法,给集合添加元素
  21.                 al.removeAll(newAl);//所有人的集合减去退出的集合,就获得最后剩下没有退出的那13个人
  22.                 for(Iterator<Integer> it = al.iterator(); it.hasNext();){//迭代取出集合的元素
  23.                         System.out.print(it.next()+" ");//打印集合的元素
  24.                 }
  25.         }

  26.         private static ArrayList<Integer> getQuit() {//创建一个方法,用于获取每次退出的那个人的角标
  27.                 ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储退出的角标
  28.                 int count = 0;//定义一个计数器,记录数数的值
  29.                 //因为是一个圆圈,假定把这个圆圈拉直,把N个这样的直线连起来,就相当于永远在圆圈转圈。
  30.                 for(int i = 1; i<101; i++){//因为有100人,定义一个循环次数为100的循环,i为每个人的角标
  31.                         count++;//记录索引值
  32.                         while(newAl.contains(i)){//判断集合是否已经添加了i
  33.                                 i++;//如果集合中已有那个元素,就往后加一个,再判断,直到集合中没有那个元素结束
  34.                                 if(i==101){//如果是第100个人的话,就从1开始
  35.                                         i = 1;
  36.                                 }
  37.                         }
  38.                         if(count%14==0){//如果计数器数到14,就将i添加到集合
  39.                                 newAl.add(i);//把这个元素加到集合去
  40.                                 count = 0;//把计数器置0;重新计数
  41.                         }
  42.                         if(i==100){//当数到第100个人的时候
  43.                                 i=1;//把索引置为1,1开始接着数。
  44.                         }
  45.                         if(newAl.size()>99)//循环终止条件:当圈子中剩余1个元素就退出循环
  46.                                 break;//退出循环
  47.                 }
  48.                 return newAl;//返回集合
  49.         }
  50. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 panzhenglian 于 2014-1-19 17:07 编辑

不知道楼主是否正确,应为我验算删除掉的应该是以下数
14  28  42  56  70  84  98      //第99人报1,第100人报2,下一圈的第一人报3,不知是不是这个规则
12  27  43  58  73  88  
3   19  35  51  67  83  100
17  34  52  69  87
5   23  41  61  79  97
18  38  59  78  99
21  44  64  86
8   31  54  77
2   26  50  76
4   30  57  85
11  40  71  96
32  63  93
25  62  94
33  68
7   46  82
22  66
10  53
1   48
95  49
9   65
20  81
45
15
89
60
37  
24
13
6
16
回复 使用道具 举报
我的代码是
  1. import java.util.ArrayList;

  2. /*
  3. * 有100个人围成一个圈,
  4. * 从1开始报数,报到14的这个人就要退出。
  5. * 然后其他人重新开始,
  6. * 从1报数,到14退出。
  7. * 问:最后剩下的是100人中的第几个人?
  8. */
  9. public class Test {
  10.         public static void main(String[] args)
  11.         {
  12.                   ArrayList<Integer> al = new ArrayList<Integer>();
  13.           for(int x = 1; x<=100; x++)
  14.                   al.add(x);
  15.          int c = 1;
  16.          Method(al,c);
  17.          for(int x = 0;x<al.size();x++)
  18.          {
  19.                  System.out.println(al.get(x));
  20.          }
  21.          //System.out.print(al.size()+"  ");//打印最后剩下数的长度
  22.          
  23.         }
  24.         private static void Method(ArrayList<Integer> al,int c)
  25.         {
  26.                 ArrayList<Integer> al2 = new ArrayList<Integer>();
  27.                 for(int x = 0;x<al.size();x++,c++){
  28.                         if((c % 14)==0){
  29.                                 al2.add(al.get(x));
  30.                                 //System.out.print(al.get(x)+"  ");//打印每次需要排除的元素
  31.                         }
  32.                 }
  33.                 al.removeAll(al2);
  34.                 if(al.size()>13)
  35.                         Method(al, c);
  36.         }
  37. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

回复 使用道具 举报
楼主的代码结果是:1 2 10 22 23 25 33 46 58 60 76 78 92
最后我拿笔在纸上验证了一下,58应该在第二轮就没了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马