本帖最后由 chslzj 于 2013-7-15 23:10 编辑
忘记放在代码块里面了- package com.itheima;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Queue;
- /**
- * 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。最后得到最后剩下的是100人中的那个人
- * @author Administrator
- *
- */
- public class Test10 {
- //这里设置报到退出的数字
- private static Integer number=14;
- private static List<Integer> list1=new ArrayList<Integer>();
- public static void main(String[] args) {
- List<Integer> list=new ArrayList<Integer>();
- //初始化队列
- //这里是100人,可以改其他数字,例如80人,就改成i<=80
- for(int i=1;i<=100;i++)
- list.add(i);
- //第二个参数是第几个人开始报数字,最后一个参数是已经有几个人退出,开始调用写0.
- System.out.println("第"+findTheNumber(list,0,0)+"号留到了最后");
- }
- //使用递归算法
- public static Integer findTheNumber(List<Integer> list,int begin,int index){
- for(int i=1;i<=number;i++)
- System.out.println("第"+list.get((begin+i-1)%list.size())+"号喊道"+i);
- int out=(begin+number-1)%list.size();
- list1.add(list.get(out));
- //将喊14的清除
- System.out.println("第"+list.remove(out)+"号喊道"+number+",退出");
- System.out.println("共有"+(++index)+"退出");
- //列出已经退出的人
- myToString(list1);
- //防止out是最后一个,清除后越界,所以使用out%list.size()
- System.out.println("下面从第"+list.get(out%list.size())+"号开始");
- if(list.size()!=1)
- //递归调用
- findTheNumber(list, out%list.size(),index);
- return list.get(0);
- }
- public static void myToString(List<Integer> list)
- {
- StringBuffer stringBuffer=new StringBuffer();
- stringBuffer.append("{");
- for(Integer i:list)
- stringBuffer.append(i+",");
- stringBuffer.deleteCharAt(stringBuffer.length()-1);
- stringBuffer.append("}");
- System.out.println(stringBuffer.toString());
- }
- }
复制代码 |