黑马程序员技术交流社区

标题: 关于100人报数报到14就退出然后重新报数的答案 [打印本页]

作者: 逝....曾经    时间: 2015-6-20 15:02
标题: 关于100人报数报到14就退出然后重新报数的答案
有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。
问:最后剩下的是100人中的第几个人?
以上是原题.
我自己写的代码是:
public static void main(String[] args) {
                        //有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。
                    //问:最后剩下的是100人中的第几个人?
                ArrayList<Integer> array = new ArrayList<Integer>();
                for(int x = 1;x <= 100 ;x++ ){
                        array.add(x);
                }
                method(array,0);
               
        }

        private static void method(ArrayList<Integer> array, int x) {
                int count = 0;
                while( array.size() > 1 ){
                        if( x < array.size() - 1 ){
                                x++;
                                count++;
                                }else{
                                        x = 0;
                                        count++;
                                }
                        if(count == 13){
                                array.remove(x);
                                System.out.println(array);
                                x = 0;
                                method(array,x);
                        }               
                }

        }
这个答案是2
别人写的代码是:
public static void main(String[] args) {
        int p = 100;

        /**** 初始化人员 ***/
        boolean[] per = new boolean[p];// boolean数组表示站成一圈的人,false表示退出
        for (int i = 0; i < per.length; i++) {
            per = true;
        }

        /**** 报号 ***/
        int t = 0, len = per.length;
        while (len > 1) {
            for (int i = 0; i < per.length; i++) {

                if (per) {
                    t++;
                    if (t == 14) {
                        t = 0;
                        per = false;
                        len--;
                    }
                }
            }
        }
        /***** 结果 *****/
        System.out.println("最后的情况:" + Arrays.toString(per));
        for (int i = 0; i < per.length; i++) {
            if (per) {
                System.out.println("原来喊的数:" + (i + 1) % 14);
            }
        }

        }
这个答案是8
还有个:
public class TreeSetDemo {
        public static void main(String[] args) {
                TreeSet<Student> set=new TreeSet<Student>();
                for(int x=1;x<101;x++) {
                        set.add(new Student(x));
                }
                System.out.println(set.size());
                int count=1;//定义一个计数器,
                /*只要集合内还有一个以上的元素,便对集合进行遍历,遍历是计数器自增,每当计数器自增到了14的时候,就
                 * 将遍历到的那个元素从集合中删除,并将计数器清零,直到集合中的元素为一的时候,跳出循环。
                 * */
                while(set.size()!=1) {
                        Iterator <Student>it=set.iterator();
                        while(it.hasNext()) {
                                if(count==14) {
                                        it.next();//
                                        it.remove();
                                        count=1;
                                        continue;
                                }
                                it.next();
                                count++;
                        }
                }
                System.out.println(set);
        }
}
class Student implements Comparable<Student> {
        public int id;
        Student(int id) {
                this.id=id;
        }
        public int compareTo(Student s) {
                return new Integer(this.id).compareTo(new Integer(s.id));
        }
        @Override
        public String toString() {
                return id+"";
        }
}
最后结果是92

寻求准确答案??????


作者: 天涯111    时间: 2015-6-20 15:49
我些的结果是75,我认为是这个结果,现在看来有好多结果啊!!坚信自己75
作者: 逝....曾经    时间: 2015-6-20 17:34
天涯111 发表于 2015-6-20 15:49
我些的结果是75,我认为是这个结果,现在看来有好多结果啊!!坚信自己75

代码上来
作者: 誓...曾经    时间: 2015-6-20 17:39
可以呀,数据应该有很多吧
作者: 逝....曾经    时间: 2015-6-20 17:51
誓...曾经 发表于 2015-6-20 17:39
可以呀,数据应该有很多吧

恩,大概就是这样子的,应该说的
作者: zlpiano    时间: 2015-6-20 20:38
  1. class Hi
  2. {
  3.        
  4.         public static void main(String[] args)
  5.         {
  6.                 int[] a = new int[100];
  7.                 int count=100;
  8.                 int n=2;
  9.                 int i=0;
  10.                
  11.                 a[0]=1;
  12.                
  13.                 while(count!=1)
  14.                 {       
  15.                         if(i==99)
  16.                                 i=0;
  17.                         else
  18.                                 i++;
  19.                                
  20.                         if(a[i]==-1)
  21.                                 continue;
  22.                        
  23.                         if(n!=14)
  24.                         {
  25.                                 a[i]=n;
  26.                                 n++;
  27.                         }
  28.                                
  29.                        
  30.                         else
  31.                         {
  32.                                 a[i]=-1;
  33.                                 n=1;
  34.                                 count--;
  35.                                 System.out.println("剩余个数"+count);
  36.                         }
  37.                 }
  38.                
  39.                 System.out.println(i+1);
  40.         }
  41. }
复制代码



答案72,绝对正确
作者: zlpiano    时间: 2015-6-20 20:42
本帖最后由 zlpiano 于 2015-6-20 21:04 编辑

我搞错了,把倒数第二个打印出来了,应该是92
作者: zlpiano    时间: 2015-6-20 20:45
如果每次都从第一个人开始数,毫无疑问,14以及以后的都要淘汰掉,最后结果在1-13之间
作者: 天涯111    时间: 2015-6-21 00:52
逝....曾经 发表于 2015-6-20 17:34
代码上来
  1. package com.itheima;
  2. /**
  3. 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
  4. */
  5. public class Text10 {
  6.         public static void main(String[] args) {
  7.         
  8.         CycLink cycLink = new CycLink();        //1.定义链表对象
  9.         cycLink.setLen(100);                                //2.设置总人数
  10.         cycLink.setK(0);                                        //3.设置从哪个人开始数
  11.         cycLink.setM(14);                                        //4.设置数到第14的这个人退出
  12.         cycLink.createLine();                                //5.创建链表
  13.         cycLink.play();                                                //7.找出剩下的最后一个人是谁
  14. }
  15. }


  16. /**
  17. * 定义Person类
  18. * 修改时间:2014-10-9 上午04:15:03
  19. */
  20. class Person{
  21. public int no;                                                        //1.人的编号
  22. public Person nextPerson = null;                //2.下一个人
  23. public Person previousPerson = null;        //3.上一个人
  24. //构造函数
  25. public Person(int no){
  26.         this.no = no;
  27. }
  28. }

  29. /**
  30. * 环形链表
  31. * 修改时间:2014-10-9 上午03:19:43
  32. */
  33. class CycLink{

  34. Person firstPerson = null;                //1.先定义一个指向链表第一个人的引用
  35. Person temp = null;
  36. int len = 0;                                        //2.表示有几个人
  37. int k = 0;                                                //3.从第几个人开始数
  38. int m = 0;                                                //4.设置数第m下的人退出

  39. //设置数第m下的人退出
  40. public void setM(int m){
  41.         this.m = m;
  42. }

  43. //设置从第几个人开始数
  44. public void setK(int k){
  45.         this.k = k;
  46. }

  47. //设置链表大小
  48. public void setLen(int len){
  49.         this.len = len;
  50. }

  51. //5.初始化环形链表
  52. public void createLine(){
  53.         
  54.         for(int i=1;i<=len;i++){
  55.                 if(i==1){
  56.                         //1.创建第一个人
  57.                         Person person = new Person(i);
  58.                         this.firstPerson = person;
  59.                         this.temp = person;
  60.                 }else {
  61.                         //2.创建最后一个人
  62.                         if(i==len){
  63.                                 Person person = new Person(i);
  64.                                 person.previousPerson = temp;
  65.                                 temp.nextPerson = person;
  66.                                 temp = person;               
  67.                                 //指定最后一个人的下一个是第一个
  68.                                 temp.nextPerson = this.firstPerson;
  69.                                 temp.nextPerson.previousPerson = person;
  70.                         }else {
  71.                                 //创建完第二个的时候指定上一个的对象是谁,也指定上一个的下一个对象是谁
  72.                                 Person person = new Person(i);
  73.                                 person.previousPerson = temp;
  74.                                 temp.nextPerson = person;
  75.                                 temp = person;
  76.                         }
  77.                 }
  78.         }
  79. }


  80. //6.游戏开始
  81. public void play(){
  82.         
  83.                 Person temp = this.firstPerson;
  84.                 //1.先找到开始数数的人
  85.                 for(int i=1;i<k;i++){
  86.                         System.out.println(temp.nextPerson.no+"开始数");
  87.                         temp = temp.nextPerson;
  88.                 }
  89.                 while(this.len != 1){
  90.                         //2.找到数第m下的人
  91.                         for(int i=1;i<m;i++){
  92.                                 temp = temp.nextPerson;
  93.                         }
  94.                         //3.将数到m的人,退出;将数到第m下的人上一个人的nextPerson指定为 数到第m下的人的nextPersono
  95.                         temp.previousPerson.nextPerson = temp.nextPerson;
  96.                         System.out.println(temp.no+"退出");
  97.                         //4.temp就变成下一轮开始数数的人
  98.                         temp = temp.nextPerson;
  99.                         //5.然后减少一个人玩游戏,
  100.                         this.len--;
  101.                 }
  102.         //6.现在temp就是退出的那个人,它的nextPerson就是最后一个人
  103.         System.out.println("剩下的是100人中的第"+temp.no+"个人");
  104.         
  105. }

  106. //7.打印链表
  107. public void show(){
  108.         Person temp = this.firstPerson;
  109.         do{
  110.                 System.out.println(temp.no);
  111.                 temp = temp.nextPerson;
  112.         }while(temp != this.firstPerson);
  113. }
  114. }
复制代码

作者: 逝....曾经    时间: 2015-6-21 12:59
zlpiano 发表于 2015-6-20 20:38
答案72,绝对正确

看不懂,能把每次循环了的数组数出来吗,因为看不懂,所以我不知道输出数组的语句要放在哪里
作者: 逝....曾经    时间: 2015-6-21 13:11
天涯111 发表于 2015-6-21 00:52

看不懂,能把每次循环了的数组数出来吗,因为看不懂,所以我不知道输出数组的语句要放在哪里
作者: 誓...曾经    时间: 2015-6-21 13:17
好多大神呀,瞧一下,不过看的不是很懂
作者: 誓...曾经    时间: 2015-6-21 13:23
逝....曾经 发表于 2015-6-20 17:51
恩,大概就是这样子的,应该说的

en.但是感觉就一个答案,问的问题有歧义,应该有4个,可是现在搜到的感觉好多
作者: 逝....曾经    时间: 2015-6-21 13:24
确实,我也不知道该咋办啦
作者: 逝....曾经    时间: 2015-6-21 13:25
誓...曾经 发表于 2015-6-21 13:17
好多大神呀,瞧一下,不过看的不是很懂

嘿嘿,你看他们的答案,我醉啦
作者: 誓...曾经    时间: 2015-6-21 13:30
逝....曾经 发表于 2015-6-21 13:25
嘿嘿,你看他们的答案,我醉啦

彼此彼此,都一样,答案太多啦
作者: 逝....曾经    时间: 2015-6-21 13:34
誓...曾经 发表于 2015-6-21 13:30
彼此彼此,都一样,答案太多啦

你现在在哪呀,进黑马啦吗
作者: 木头人之死    时间: 2015-6-24 23:01
//存100个数1表示人在0表示没人
                        int[] renshu=new int[100];
                        for(int i=0;i<100;i++){
                                renshu[i]=1;
                        }
                        boolean b=true;
                        //biaoji用于标记数一个人加一下
                        int biaoji=0;
                        //gai表示该数第几个
                        int        gai=0;
                        //表示剩余人数
                        int sheng=100;
                        //当只剩一个就退出
                        while(sheng>1){       
                                //开始数人1表示人在则标记加1
                                if(renshu[gai]==1){
                                        biaoji++;
                                }
                                //判断是否数到第14个,是则把数到的这人人杀了并把值改为0,剩下的人就少一个,并把标记清零
                                if(biaoji==14){
                                        renshu[gai]=0;
                                        sheng--;
                                        biaoji=0;
                                }
                                //当判断到第100个的时候则重新开始数不然就该下一个就是gai加1
                                if(gai==99){
                                        gai=0;
                                }
                               
                                else{gai++;}
                               
                        }
                        for(int i=0;i<100;i++){
                                if(renshu[i]==1){
                                        System.out.print(i);
                                }
                        }
这个能看懂了吧
作者: 逝....曾经    时间: 2015-6-25 11:32
木头人之死 发表于 2015-6-24 23:01
//存100个数1表示人在0表示没人
                        int[] renshu=new int[100];
                        for(int i=0;i1){       

en,看懂啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2