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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?这道题你们的结果是多少?代码我写完了,我的结果是剩下的是100人中的第75个人。

45 个回复

倒序浏览
我和好多人的答案都是92
回复 使用道具 举报
可以贴出代码让潜伏的大神们修改一下
回复 使用道具 举报
杨佳名 发表于 2014-10-9 16:06
可以贴出代码让潜伏的大神们修改一下

这道题我是看完 韩顺平的 这个视频做出来的: 循序渐进学 java 从入门到精通 第11讲-约瑟夫问题.avi


  1. package com.itheima;


  2. /**
  3. * 第十题:有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
  4. * 修改时间:2014-10-9 上午01:23:57
  5. */
  6. public class Test10 {
  7.        
  8.         public static void main(String[] args) {
  9.                
  10.                 CycLink cycLink = new CycLink();        //1.定义链表对象
  11.                 cycLink.setLen(100);                                //2.设置总人数
  12.                 cycLink.setK(0);                                        //3.设置从哪个人开始数
  13.                 cycLink.setM(14);                                        //4.设置数到第14的这个人退出
  14.                 cycLink.createLine();                                //5.创建链表
  15. //                cycLink.show();                                                //6.打印链表
  16.                 cycLink.play();                                                //7.找出剩下的最后一个人是谁
  17.         }
  18. }


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

  32. /**
  33. * 环形链表
  34. * 修改时间:2014-10-9 上午03:19:43
  35. */
  36. class CycLink{
  37.        
  38.         Person firstPerson = null;                //1.先定义一个指向链表第一个人的引用
  39.         Person temp = null;
  40.         int len = 0;                                        //2.表示有几个人
  41.         int k = 0;                                                //3.从第几个人开始数
  42.         int m = 0;                                                //4.设置数第m下的人退出
  43.        
  44.         //设置数第m下的人退出
  45.         public void setM(int m){
  46.                 this.m = m;
  47.         }
  48.        
  49.         //设置从第几个人开始数
  50.         public void setK(int k){
  51.                 this.k = k;
  52.         }
  53.        
  54.         //设置链表大小
  55.         public void setLen(int len){
  56.                 this.len = len;
  57.         }
  58.        
  59.         //5.初始化环形链表
  60.         public void createLine(){
  61.                
  62.                 for(int i=1;i<=len;i++){
  63.                         if(i==1){
  64.                                 //1.创建第一个人
  65.                                 Person person = new Person(i);
  66.                                 this.firstPerson = person;
  67.                                 this.temp = person;
  68.                         }else {
  69.                                 //2.创建最后一个人
  70.                                 if(i==len){
  71.                                         Person person = new Person(i);
  72.                                         person.previousPerson = temp;
  73.                                         temp.nextPerson = person;
  74.                                         temp = person;               
  75.                                         //指定最后一个人的下一个是第一个
  76.                                         temp.nextPerson = this.firstPerson;
  77.                                         temp.nextPerson.previousPerson = person;
  78.                                 }else {
  79.                                         //创建完第二个的时候指定上一个的对象是谁,也指定上一个的下一个对象是谁
  80.                                         Person person = new Person(i);
  81.                                         person.previousPerson = temp;
  82.                                         temp.nextPerson = person;
  83.                                         temp = person;
  84.                                 }
  85.                         }
  86.                 }
  87.         }
  88.        
  89.        
  90.         //6.游戏开始
  91.         public void play(){
  92.                
  93.                         Person temp = this.firstPerson;
  94.                         //1.先找到开始数数的人
  95.                         for(int i=1;i<k;i++){
  96.                                 System.out.println(temp.nextPerson.no+"开始数");
  97.                                 temp = temp.nextPerson;
  98.                         }
  99.                         while(this.len != 1){
  100.                                 //2.找到数第m下的人
  101.                                 for(int i=1;i<m;i++){
  102.                                         temp = temp.nextPerson;
  103.                                 }
  104.                                 //3.将数到m的人,退出;将数到第m下的人上一个人的nextPerson指定为 数到第m下的人的nextPersono
  105.                                 temp.previousPerson.nextPerson = temp.nextPerson;
  106.                                 System.out.println(temp.no+"退出");
  107.                                 //4.temp就变成下一轮开始数数的人
  108.                                 temp = temp.nextPerson;
  109.                                 //5.然后减少一个人玩游戏,
  110.                                 this.len--;
  111.                         }
  112.                 //6.现在temp就是退出的那个人,它的nextPerson就是最后一个人
  113.                 System.out.println("剩下的是100人中的第"+temp.no+"个人");
  114.                
  115.         }
  116.        
  117.         //7.打印链表
  118.         public void show(){
  119.                 Person temp = this.firstPerson;
  120.                 do{
  121.                         System.out.println(temp.no);
  122.                         temp = temp.nextPerson;
  123.                 }while(temp != this.firstPerson);
  124.         }
  125.        
  126. }
复制代码
回复 使用道具 举报 1 0
回复 使用道具 举报
ye361571404 发表于 2014-10-9 17:09
这道题我是看完 韩顺平的 这个视频做出来的: 循序渐进学 java 从入门到精通 第11讲-约瑟夫问题.avi

请问“其他人重新开始”是从那个人开始啊,是原来的1,??还是接下来要开始报数的15啊?
回复 使用道具 举报 1 0
十万一千 发表于 2014-10-9 17:13
http://bbs.itheima.com/forum.php?mod=viewthread&tid=147049&page=2#pid1018015

请问“其他人重新开始”是从那个人开始啊,是原来的1,??还是接下来要开始报数的15啊?
回复 使用道具 举报
贾浩田 发表于 2014-10-18 17:26
请问“其他人重新开始”是从那个人开始啊,是原来的1,??还是接下来要开始报数的15啊? ...

接下来开始报数的15
回复 使用道具 举报
结果为92吧。

  1. import java.util.*;
  2. class test110
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 //定义一个arraylist集合存储元素
  7.                 ArrayList<Integer> al = new ArrayList<Integer>();

  8.                         //向集合中添加100个元素(1-100数字)
  9.                         for(int i=1;i<=100;i++)
  10.                         {
  11.                                 al.add(i);
  12.                         }
  13.                 method_1(al);
  14.         }

  15.         public static void method_1(ArrayList<Integer> al)
  16.         {
  17.                 //此处定义一个集合,是为了方便后面删除元素用。
  18.                 ArrayList<Integer> buf = new ArrayList<Integer>();
  19.                
  20.                 //定义一个计数器,记录大家的报数。
  21.                 int count=0;

  22.                 //一直循环报数(1-100转完一圈再继续转的意思),删除元素,直到只剩下一个元素
  23.                 while(true)
  24.                 {
  25.                         //判断元素是否为1
  26.                         if(al.size()>1)
  27.                         {
  28.                                 //100个人内部1-14循环报数
  29.                                 for(int index=0;index<al.size();index++)
  30.                                 {
  31.                                         //进入循环一次,计数器+1
  32.                                         count++;

  33.                                         //判断判断报的数是否为14的倍数,这里对1-14循环报数稍微做了下转换,应该不难理解
  34.                                         if(count%14==0)
  35.                                         {
  36.                                                 //如果该角标的报数为14的倍数,则将该元素添加到上面定义好的buf集合。
  37.                                                 buf.add(al.get(index));       
  38.                                         }
  39.                                 }

  40.                                 //一次性删除al集合中包含的buf集合中的元素。
  41.                                 al.removeAll(buf);
  42.                                 //清空buf集合
  43.                                 buf.clear();
  44.                         }
  45.                         else
  46.                                 break;
  47.                 }

  48.                 System.out.println(al);
  49.         }
  50. }
复制代码
回复 使用道具 举报 1 0
贾浩田 发表于 2014-10-18 17:28
请问“其他人重新开始”是从那个人开始啊,是原来的1,??还是接下来要开始报数的15啊? ...

http://bbs.itheima.com/forum.php ... p;page=5#pid1025567
你看下这个页面吧。。。   退出一个人以后,当然是从退出的那个人的后一个人开始重新报数啦,从1开始报。
回复 使用道具 举报
我怎么觉得最后一个移除的元素肯定是14的整数被啊,应该是98(14x7)啊
回复 使用道具 举报
十万一千 发表于 2014-10-18 21:36
http://bbs.itheima.com/forum.php?mod=viewthread&tid=147049&page=5#pid1025567
你看下这个页面吧。。 ...

谢谢,请问最后说“最后剩下的是100人中的第几个人?”这句话是什么意思啊,在问什么啊?我有点没读懂题意?什么叫最后剩下的啊,最后一个被移除的元素应该是a98啊,总共移除了7个元素,那最后一个人应该是第100-7=93的那个啊?怎么会是92呢?
回复 使用道具 举报
贾浩田 发表于 2014-10-18 22:54
谢谢,请问最后说“最后剩下的是100人中的第几个人?”这句话是什么意思啊,在问什么啊?我有点没读懂题 ...

最后剩余的当然是从来也没有自己报14的那个人啊 如果有100个人围成一个圈,那么经过不断报数后,总共移除了100-1个人了。最后在100个人中第几个人是指初始状态下这个人的编号。
回复 使用道具 举报
十万一千 发表于 2014-10-18 23:20
最后剩余的当然是从来也没有自己报14的那个人啊 如果有100个人围成一个圈,那么经过不断报数后,总共移除 ...

哦 意思是说所有人围城一个圈啊?那就是说要连续不断的持续报数喽?那看来有点深度
回复 使用道具 举报
class Test{
        public static void main(String[] args){
        int N = 100;
        int s = 0;
        int m = 14;
        for(int i=2; i<=N; i++) {
        s = (s+m)%i;
        }
        System.out.println("最终会留下的人的编号为:" + (s+1));
}
}
回复 使用道具 举报
  1. class Test{
  2.         public static void main(String[] args){
  3.         int N = 100;
  4.         int s = 0;
  5.         int m = 14;
  6.         for(int i=2; i<=N; i++) {
  7.         s = (s+m)%i;
  8.         }
  9.         System.out.println("最终会留下的人的编号为:" + (s+1));
  10. }
  11. }
复制代码
回复 使用道具 举报
贾浩田 发表于 2014-10-18 17:26
请问“其他人重新开始”是从那个人开始啊,是原来的1,??还是接下来要开始报数的15啊? ...

同问啊!!!“其他人重新开始”到底是从哪里重新开始(下一个?从头?)  题目根本没有说明白啊!!
------从下一个开始是92,从头开始是2.。。。。。。
回复 使用道具 举报
米家小九 来自手机 中级黑马 2014-12-23 20:26:52
18#
先瞅瞅,继续学习中
回复 使用道具 举报
顶顶顶顶顶
回复 使用道具 举报
  1. package com.itheima;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. /*
  5. *10、 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
  6. *然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
  7. *
  8. * 思路:
  9. *         集合元素的角标从0开始 要删除第14个人就是删除13角标
  10. *         删除之后其他人继续重新报数那么就是在原来角标上+13 —— +14的话 删除的是报15的人
  11. *  由于当集合的长度<14时会循环报数 故做%size操作
  12. *
  13. */

  14. public class Test10 {
  15.         public static void main(String[] args) {
  16.                 List<Integer> list = new ArrayList<Integer>();
  17.                 //添加100人到集合
  18.                 for (int i = 1; i < 101; i++) {
  19.                         list.add(i);
  20.                 }
  21.                 System.out.println(list);
  22.                 //删除所有报14的人
  23.                 remove(list);
  24.         }

  25.         private static void remove(List<Integer> list) {
  26.                 // TODO Auto-generated method stub
  27.                 //确定集合长度
  28.                 int size = list.size();
  29.                 //设置被删除的角标 因为集合角标从0开始 所以第一次删除13
  30.                 //如果集合的长度<要删除的角标数 要做取余操作
  31.                 int index = 13%size;
  32.                 while(size>1){
  33.                         //长度大于1 删除指定位置的元素
  34.                         list.remove(list.get(index));
  35.                         //删除一个元素集合长度-1
  36.                         size--;
  37.                         //重新确定角标
  38.                         index = (index+13)%size;
  39.                 }
  40.                 //集合只剩下一个元素
  41.                 System.out.println("100人中剩下的是第-"+list.get(0)+"-个人");
  42.         }
  43. }
复制代码
兄弟我写了一个  看我的是不是另类  有这么写的么
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马