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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 古银平 中级黑马   /  2012-10-24 22:40  /  4537 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

50个人围成一个圈数到3和3的倍数时出圈,问剩下的人是谁?在原来的位置是多少

要求:1.写出自己的思路和分析过程;
          2.程序代码要求有注释说明;

18 个回复

倒序浏览
论坛有点冷清。。。我多希望这个版块像安卓那样火起来!古同学。。。。。我们想想办法吧
回复 使用道具 举报
class  Demo
{
        public static void main(String[] args)
        {
                int n=0;
                for(int i=1;i<=50;i++)   
                {
                        if(i%3==0)
                        {
                                System.out.println(i+"出圈");
                        }
                }
       
        }
}






{:soso_e109:}太可怜了,就能做到这点.55555555555555555555555555555
回复 使用道具 举报
int n=0;
是想做剩余人数的记录. 怎么搞都不对.,郁闷
回复 使用道具 举报
class  Demo
{
public static void main(String[] args)
{ System.out.println("出圈的人是:");
  int n=0;
  for(int i=1;i<=50;i++)   //遍力循环  50个人
  {
   if(i%3==0)  //条件碰到3和3的倍数跳出
   {
    System.out.print(i);
    System.out.print('\t');
   }
  }
  System.out.println('\n');
  person(n); //调用函数 把剩余的人数记录下来

}
public static void person(int s)
{
  System.out.println("剩余留下的人是:");
  for(s=1;s<=50;s++)
  {
   if(s%3!=0)
   {
    System.out.print(s);
    System.out.print('\t');
   }
   
  }
}
}

未命名.jpg (15.46 KB, 下载次数: 70)

未命名.jpg

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 你只是简单的遍历了一下50个人,50十个人是.

查看全部评分

回复 使用道具 举报
{:soso_e100:}
回复 使用道具 举报
我做的对不对啊.  那个在原来的位置是多少 怎么搞?{:soso_e110:}

回复 使用道具 举报
我是这么考虑,50个人,从1开始报数数到3出列,到50了,继续从队头开始计数,因此如循环最终只会剩下一个人。我用一个arrayList数组,模拟50个人,从第一个索引开始,每循环三次,我就删除当前值,然后,以当前值的下一次元素开始计数,如此循环,最后留下肯定只有一个,就是索引值为0所对应的序号;
程序如下(如有不足请多多指教):
  1. public class Chuquan {

  2.         public static void main(String[] args) {
  3.                 List<Integer> peoples = new ArrayList<Integer>();
  4.                 for (int i = 1; i <= 50; i++) {
  5.                         peoples.add(i);// 初始化50个人,名称分别1,2,3...50
  6.                 }
  7.                 int i = -1;
  8.                 int length = peoples.size();
  9.                 for (int k = 1; k <= length; k++) {
  10.                         int j = 0; // 报数(每循环一次,就是新一轮的报数)
  11.                         while (j < 3) {
  12.                                 i++;
  13.                                 if (i == peoples.size()) // 到终点,返回到第一个位置计数
  14.                                         i = 0;
  15.                                 j++;// 报数加1
  16.                         }
  17.                         if (k == length)
  18.                                 break;
  19.                         System.out.println("序号为 " + peoples.get(i) + " 的出圈");
  20.                         peoples.remove(i); // 删除出圈人的记录
  21.                         --i; // 调整计数位置初始值
  22.                 }

  23.                 // break语句跳转至此处,输出最后出列的编号,最后留下肯定只有一个,就是索引值为0所对应的序号
  24.                 System.out.println("最后留下了:" + peoples.get(0));

  25.         }
  26. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
古银平 + 2 赞一个!你这样的效率不是很高。.

查看全部评分

回复 使用道具 举报
冯海霞 发表于 2012-10-24 23:47
论坛有点冷清。。。我多希望这个版块像安卓那样火起来!古同学。。。。。我们想想办法吧 ...

慢慢会好的
回复 使用道具 举报
{:soso_e179:}
回复 使用道具 举报
冯海霞 发表于 2012-10-24 23:47
论坛有点冷清。。。我多希望这个版块像安卓那样火起来!古同学。。。。。我们想想办法吧 ...

ok,我们几个一起想想吧,多搞些活动
回复 使用道具 举报
坚持不懈 发表于 2012-10-25 00:41
class  Demo
{
public static void main(String[] args)

五十个人是连成一个圈,你只是把遇到3和3的倍数给弄出来了,参与就好
回复 使用道具 举报
高薇 中级黑马 2012-10-25 08:58:47
13#
思路:定义一个50人围成的圈,当数到3或者3的倍数时,这个人出圈,记录下出圈的人,除此之外便是剩下的人了.
         * 步骤:1.定义一个变量,开始循环,条件为3或者3的倍数,便是出圈的人
         *     2.除此之外,剩下的人便是留下的人.
         */
        public static void main(String[] args) {
                for(int i=1;i<=50;i++){//定义一个变量从1开始循环到50
                        if(i%3==0){//如果这个人所在的位置是3或者3的倍数,执行下面的语句
                                System.out.println("出圈的人:"+i);
                        }
                        else{           //如果 这个人所在的位置不是3的倍数,执行下面的语句
                                System.out.println("剩下的人有:"+i);
                        }
                }
        }

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 这是站成一排吧!鼓励下

查看全部评分

回复 使用道具 举报
王龙 中级黑马 2012-10-25 11:49:47
14#
为了咱们这个论坛更加活跃, 我愿意出自己一份力气嘿嘿
回复 使用道具 举报
付维翔 发表于 2012-10-25 02:34
我是这么考虑,50个人,从1开始报数数到3出列,到50了,继续从队头开始计数,因此如循环最终只会剩下一个人 ...

效率的确是低了点,查了一下资料,看到了约瑟夫环问题的解决方案后,明白了其中出圈的规律:修改后的代码如下:
  1. public class chuquan {
  2. public static void main(String[] args) {
  3. int s = 0;
  4. for (int i = 2; i <= 50; i++) {
  5. s = (s + 3) % i;
  6. }
  7. System.out.println("最后剩下的人是:" + (s + 1));
  8. }
  9. }
复制代码
输出结果:最后剩下的人是:11

回复 使用道具 举报
也不晓得什么原理,照自己最普通的循环想法做了下:循环数组中每一个元素,并且用一个计数器t记录报的数,1-3这样循环,到了3后又变1,同时把数组中的元素踢出去(试了一下,数组不能remove,所以就把值变为0),当到了最后一个还没完时,又从0开始循环数组的每一个元素,以此类推,最后一个不0的就是最后出列的。(假设数组的元素是从1到50的,中间不能有为0的元素)。
回复 使用道具 举报
package com.efoxconn.util;

public class QuanTest {

        public static void main(String[] args){
                disArray(getResult(getArray(1)));                //留下1
                disArray(getResult(getArray(2)));                //留下2
                disArray(getResult(getArray(3)));                //留下2
                disArray(getResult(getArray(50)));                //留下11
        }
        //自动创建数组
        public static int[] getArray(int num){
                int length=num;
                int[] arr=new int[length];
                for(int i=0;i<length;i++){
                        arr[i]=i+1;
                }
                return arr;
        }
       
        /*
         * 思路:用count做计数器,从1开始到3结束,如此循环 。
         * 当count%3=0时,count重新从1开始计数,同时把当前的数组元素踢出(数组不能remove就只好设为0模拟),
         * 并且把数组长度-1,不然就死循环了。
         * 用index记录数组下标,当一轮循环完时,继续重新开始循环知道最后一个不为0的元素就是最后留下的人。
         */
       
        public static int[] getResult(int[] arr){
                int[] rearr=arr;
                int length=rearr.length;
                int index=0;
                int count=0;
                while(length>1){
                        if(rearr[index]!=0){
                                count++;
                                if(count%3==0){
                                        count=0;
                                        rearr[index]=0;
                                        length--;
                                }
                        }
                        index++;
                        if(index==rearr.length){
                                index=0;
                        }
                }
                return rearr;
        }

        //循环显示目标数组的每一个元素
        public static void disArray(int[] arr){
                int length=arr.length;
                for(int i=0;i<length;i++ ){
                        System.out.print(arr[i]+" ");
                }
                System.out.println();
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!圈应该想到链表

查看全部评分

回复 使用道具 举报
up_ 中级黑马 2012-10-26 18:22:52
18#
import java.util.Arrays;

/*50个人围成一个圈数到3和3的倍数时出圈,问剩下的人是谁?在原来的位置是多少

要求:1.写出自己的思路和分析过程;
          2.程序代码要求有注释说明;*/
public class Lianxiti2 {
        public static void main(String[] args) {
                int[] arr = new int[50];
                for(int x=0;x<arr.length; x++){
                        arr[x] = x+1;//角标位比元素值小一;
                }
                demo(arr);
                System.out.println(Arrays.toString(arr));
        }
        public static void demo(int[] arr){
                int pos = -1;//定义角标为-1,
                for (int i = 0; i < arr.length-1; i++) {
                        for(int y=0; y<3; y++){
                                pos++;//角标的变化规律是每数到第三个人,就往下顺延一位。
                                if(pos==arr.length){
                                        pos=0;//每当数到末尾,让角标归位。
                                }
                                while(arr[pos]==0){
                                        pos++;//让角标往下顺延
                                        if(pos==arr.length){
                                                pos=0;
                                        }
                                }
                        }
                        arr[pos]=0;//把值置为0
                }       
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1

查看全部评分

回复 使用道具 举报
跟一个!
  1. /**
  2. *         50个人围成一个圈数到3和3的倍数时出圈,问剩下的人是谁?在原来的位置是多少

  3.         要求:1.写出自己的思路和分析过程;
  4.           2.程序代码要求有注释说明;
  5.          
  6.         思路:
  7.         1、首先创建一个环形链表;
  8.         2、设置链表长度等于50;
  9.         3、设置从第一个小孩开始数数;
  10.         4、设置当有小孩小孩数到3的倍数时,就规定让这个小孩出圈,
  11.                然后让指针指向下一个小孩,接着往下数,直到数到最后一个
  12.                小孩,小孩数数的游戏结束
  13. */
  14. package com.test2;

  15. public class Test {

  16. public static void main(String[] args) {
  17.                
  18.                 //创建一个环形链表实例
  19.                 CycLink cyclink=new CycLink();
  20.                
  21.                 //设置有多少小孩
  22.                 cyclink.setLen(50);
  23.                 cyclink.createLink();
  24.                
  25.                 //设置从第几个小孩开始数数,
  26.                 cyclink.setK(1);
  27.                 //设置数到几的倍数
  28.                 cyclink.setM(3);
  29.                
  30.                 cyclink.show();       
  31.                 //调用play方法,开始游戏
  32.                 cyclink.play();
  33.         }

  34. }
  35. class Child
  36. {
  37.         int no;
  38.         Child nextChild=null;
  39.         public Child(int no)
  40.         {
  41.                 //给一个编号
  42.                 this.no=no;
  43.         }
  44. }
  45. class CycLink
  46. {
  47.         //先定义一个指向链表第一小孩的引用
  48.         //指向第一个小孩的引用,不能动
  49.         Child firstChild=null;
  50.         Child temp=null;
  51.        
  52.         //表示共有几个小孩
  53.         int len=0;
  54.         int k=0;
  55.         int m=0;
  56.        
  57.         //设置链表大小
  58.         public void setLen(int len)
  59.         {
  60.                 this.len=len;
  61.         }
  62.         //设置从第几个人开始数数
  63.         public void setK(int k)
  64.         {
  65.                 this.k=k;
  66.         }
  67.         //设置数到几的倍数
  68.         public void setM(int m)
  69.         {
  70.                 this.m=m;
  71.         }
  72.        
  73.         // 开始play
  74.         public void play()
  75.         {
  76.                 Child temp=this.firstChild;
  77.                 //1、先找到开始数数的人
  78.                 for(int i=0;i<k;i++)
  79.                 {
  80.                         temp=temp.nextChild;
  81.                 }
  82.                 while(this.len!=1)
  83.                 {
  84.                         //当数到的数不是3的倍数时
  85.                         for(int j=1;(j%m)!=0;j++)
  86.                         {
  87.                                 temp=temp.nextChild;
  88.                         }
  89.                        
  90.                         //找到要出圈的前一个小孩
  91.                         Child temp2=temp;
  92.                         while(temp2.nextChild!=temp)
  93.                         {
  94.                                 temp2=temp2.nextChild;
  95.                         }
  96.                         //3、将数到3的倍数的小孩退出圈
  97.                         temp2.nextChild=temp.nextChild;
  98.                         //让temp指向下一个小孩
  99.                         temp=temp.nextChild;
  100.                         this.len--;
  101.                 }
  102.                 //最后一个小孩
  103.                 System.out.println("\n最后一个小孩原来的位置是:"+temp.no+"号");
  104.         }
  105.        
  106.         //初始化环形链表
  107.         public void createLink()
  108.         {
  109.                 for(int i=1;i<=len;i++)
  110.                 {
  111.                         if(i==1)
  112.                         {
  113.                         //创建第一个小孩
  114.                         Child ch=new Child(i);
  115.                         this.firstChild=ch;
  116.                         this.temp=ch;
  117.                         }
  118.                         else
  119.                         {
  120.                                 //创建最后一个小孩
  121.                                 if(i==len)
  122.                                 {
  123.                                         Child ch=new Child(i);
  124.                                         temp.nextChild=ch;
  125.                                         temp=ch;
  126.                                         temp.nextChild=this.firstChild;
  127.                                 }
  128.                                 else
  129.                                 {
  130.                                 //继续创建小孩
  131.                                 Child ch=new Child(i);
  132.                                 temp.nextChild=ch;
  133.                                 temp=ch;
  134.                                 }
  135.                         }
  136.                 }
  137.         }
  138.         //打印该环形链表
  139.         public void show()
  140.         {
  141.                 Child temp=this.firstChild;
  142.                 do
  143.                 {
  144.                         if((temp.no%10)==0)
  145.                         {
  146.                                 //设置没输出10个小孩换行
  147.                                 System.out.println(temp.no+"\n");
  148.                         }else{
  149.                                 System.out.print(temp.no+", ");
  150.                         }
  151.                        
  152.                         //定义一个临时变量
  153.                         temp=temp.nextChild;
  154.                 }while(temp!=this.firstChild);
  155.         }
  156. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 迟了,不过鼓励下

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马