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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 提菩--空 中级黑马   /  2014-5-9 17:28  /  1365 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 提菩--空 于 2014-5-12 17:59 编辑

一排小孩数三,数到三的退出,最后一个小孩报数后,第一个小孩接着报,相当于一个循环。问最后一个孩子是这排孩子的第几位。我写不出来,那位能给个思路。

8 个回复

倒序浏览
去查约瑟夫环
回复 使用道具 举报
  1. //用了一个很笨的方法,水平有限,还在学基础。
  2. import java.util.Scanner;
  3. class Demo
  4. {
  5.         static int renShu;
  6.         static int weiZhi;
  7.         static int geiZeShu;
  8.         public static void main(String[] args)
  9.         {
  10.                 System.out.print("请输入参加游戏的人数:");
  11.                 Scanner in = new Scanner(System.in);
  12.                 renShu = in.nextInt();
  13.                 int[] arr = new int[renShu];
  14.                 geiZeShu = 3;//此处的规则数可以重新设定
  15.                 weiZhi = search(arr,geiZeShu);
  16.                 System.out.println("剩下的是第"+weiZhi+"个小朋友。");
  17.         }
  18.         public static int search(int[] arr,int x)//循环数数,直至最后一个小朋友
  19.         {
  20.                 x = geiZeShu;
  21.                 int m = 0;
  22.                 int n = 0;
  23.                 for (int i = 0;i<arr.length;i++)//确定所有人的位置
  24.                 {
  25.                         arr[i] = 1;
  26.                 }
  27.                 for (int i = 0;i<=arr.length;i++)
  28.                 {
  29.                         if (i==arr.length)//尾部接上头部,继续循环
  30.                         {
  31.                                 if (n==1)//只剩一个人时,游戏结束
  32.                                 {
  33.                                         return searchIndex(arr,1);
  34.                                 }
  35.                                 i = 0;
  36.                                 n = 0;
  37.                         }
  38.                         if (arr[i]==1)//剩余的小朋友继续数数
  39.                         {
  40.                                 m++;
  41.                                 n++;
  42.                         }
  43.                         if (m==x)//数到规则数的人退出,再重新开始数
  44.                         {
  45.                                 m = 0;
  46.                                 arr[i] = x;
  47.                         }
  48.                        
  49.                 }
  50.                 return -1;
  51.         }
  52.         public static int searchIndex(int[] arr,int j)//找出剩下的最后一个小朋友的位置
  53.         {
  54.                 for (int i = 0;i<arr.length;i++)
  55.                 {
  56.                         if (arr[i]==j)
  57.                                 return i+1;
  58.                 }
  59.                 return -1;
  60.         }
  61. }
复制代码
回复 使用道具 举报
这个是五一搞活动的题目啊,网上搜索下,很多相关的
回复 使用道具 举报
可以拿循环链表做
回复 使用道具 举报
这个简单啊,
回复 使用道具 举报
import java.util.Arrays;
import java.util.Scanner;

class Demo_SitNum
{


  public static void main(String[] args)
  {
     Scanner input=new Scanner(System.in);
     System.out.println("请输入总人数:");
     int i = input.nextInt();//输入的总人数;
     
     
/******************  初始化人员  ************************/

     boolean[] persons = new boolean[i];
     for(int m=0;m<persons.length;m++)   //赋值数组所有元素为true;
      {
        persons[m] = true;
         }
     System.out.println("※※※※※※※※※※※※※ *或得的结果为* ※※※※※※※※※※※※\n");
     System.out.print("开始的数组情况为:");
     for(boolean person:persons)//foreach遍历数组元素,注:foreach只能取值不能赋值;
      {
        System.out.print(person+"; ");
         }


/*********************  开始循环报数  ************************/

    int x=0, all=persons.length;
outer: //为打破死循环做个标记;
while(true)
{
  for(int y=0;y<persons.length;y++)
   {
    if(persons[y])
     { x++;
       if(x==3)
       { x=0;
         persons[y]=false;
         all--; }
       }
    }
  if(all<2){ break outer; }//如果剩下的人数少于2人则循环结束;
  }

/***********************  输出最后结果  ************************/

   System.out.println("\n结束的数组情况为:"+Arrays.toString(persons));

   System.out.print("最后留下的人的编号为:  ");
    for(int y=0;y<persons.length;y++)
    {
      if(persons[y])
       {
        System.out.print((y+1)+";");
        }
     }
    System.out.println("\n\n※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    input.close();//关闭Scanner流

   }
}


以前做的,看一下……
回复 使用道具 举报
把所有的人记为一个数组,全部为true,开始计数,数一个true,常数就加一个,常数每到三个,元素改为false,一直做循环,直到true总数变成一,
回复 使用道具 举报
谢谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马