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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Rain2692 高级黑马   /  2014-12-15 19:50  /  1559 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Rain2692 于 2014-12-15 19:59 编辑

有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?(此代码十分精简,而且涵盖可以解决很多问题,精心整理)
  1. <p>[hide]public static void main(String[] args) throws IOException {
  2. // 这是猴子选大王(约瑟夫环问题)的经典题目
  3. System.out.println("请输入人数及报到的号码格式为XXX YYY:");//输入格式为100 14
  4. BufferedReader bufw = new BufferedReader(new InputStreamReader(System.in));
  5. String[] num = bufw.readLine().split(" ");//空格为分隔符
  6. int Pernum = Integer.parseInt(num[0]);
  7. int Counum = Integer.parseInt(num[1]);
  8. //获取上面的两个数

  9. boolean[] persons = new boolean[Pernum];//标记数组
  10. for(int i=0;i<persons.length;i++)
  11. {
  12.      persons[i] = true;
  13. }

  14. int len = persons.length;
  15. int t = 0;//标记变量
  16. while(len>1)
  17. {
  18.   for(int i=0;i<persons.length;i++)
  19.   {
  20.      if(persons[i])
  21.      {
  22.      t++; //累加到指定值Counum
  23.      if(t == Counum)
  24.       {
  25.         t = 0; //清零处理
  26.         persons[i]=false;//标记数组改变
  27.         len--; //退出,则人数减一
  28.       }
  29.    }
  30. }
  31. for(int i=0;i<persons.length;i++)
  32. {
  33.     if(persons[i])
  34.       System.out.println("最后剩下的是原来的第"+(i+1)+"个人");//因为这是从零开始的所以要加1处理一下
  35. }
  36. }
  37. [/hide]
  38. </p>
复制代码

9 个回复

倒序浏览
先占一个。。。
回复 使用道具 举报
我也占一个。。顺便学习学习。
回复 使用道具 举报
本帖最后由 as604049322 于 2014-12-16 08:45 编辑

楼主的方法很不错
回复 使用道具 举报
学习了,赞一个。
回复 使用道具 举报
学习了!!!
回复 使用道具 举报
zmhlnrs 中级黑马 2014-12-15 23:01:14
7#
学习了 赞一个
回复 使用道具 举报
我就在这用链表来做了
  1. public static String getRing2(int total,int m,boolean isAll){
  2.         LinkedList<Integer> container=new LinkedList<Integer>();
  3.     for(int i=1;i<=total;i++)
  4.         container.add(i);
  5.     //初始化集合完成。
  6.     int count=1;//count用于数数,从1数到m。
  7.     StringBuilder result=new StringBuilder();
  8.     String temp="";
  9.     while(container.size()!=1){//一直数数,剔除目标元素,直到容器内只剩一个元素
  10.         for(int num=0;num<container.size();num++){//num用于遍历容器内的每一个元素
  11.         /*数到m,则剔除容器的内的当前元素
  12.         由于link集合剔除一个元素,意味着后面所有元素的角标-1,所以让num在剔除后自减
  13.         将count置0,下次循环继续从1开始数数。*/
  14.             if(count==m){
  15.                 temp=container.remove(num--)+",";
  16.                 if(isAll)
  17.                     result.append(temp);
  18.                 count=0;
  19.             }
  20.             count++;
  21.         }
  22.     }
  23.     result.append(container.remove());
  24.     return result.toString();
  25. }


  26.     public static String getRing3(int totalNum ,int m,boolean isAll){
  27.         class Node{
  28.             public int number;// 编号
  29.             public Node next;// 下一个节点
  30.             public Node(int number){
  31.                 this.number = number;
  32.             }
  33.         }
  34.                 Node header = new Node(1);
  35.         Node pointer = header;
  36.         for (int i = 2; i <= totalNum; i++) {
  37.             pointer.next = new Node(i);
  38.             pointer = pointer.next;
  39.         }
  40.         pointer.next = header;
  41.         // 初始化环形链表结束
  42.         StringBuilder result=new StringBuilder();
  43.         while (pointer != pointer.next) {
  44.             for (int i = 1; i < m; i++)
  45.                 pointer = pointer.next;
  46.             if(isAll)
  47.                 result.append(pointer.next.number+",");
  48.             pointer.next = pointer.next.next;
  49.         }
  50.         result.append(pointer.next.number);
  51.         return result.toString();
  52.     }
复制代码
回复 使用道具 举报
哇,你们好厉害啊,看来偶要多学多练了啊
回复 使用道具 举报
Eagle 高级黑马 2014-12-16 12:28:54
10#
约瑟夫。。咳咳,,这就是差距啊、、、
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马