黑马程序员技术交流社区
标题:
大神帮我看看我这代码运行能不能获得正确结果
[打印本页]
作者:
杨道红
时间:
2014-1-19 14:24
标题:
大神帮我看看我这代码运行能不能获得正确结果
本帖最后由 杨道红 于 2014-1-19 22:34 编辑
import java.util.ArrayList;
import java.util.Iterator;
/*
* 有100个人围成一个圈,
* 从1开始报数,报到14的这个人就要退出。
* 然后其他人重新开始,
* 从1报数,到14退出。
* 问:最后剩下的是100人中的第几个人?
*/
public class Test10 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> al = new ArrayList<Integer>();//新建一个集合,用于存储这100个人
for(int i = 1; i<=100; i++)//给集合添加元素
al.add(i);//添加到集合
ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储每次退出的那个人
newAl = getQuit();//通过调用getQuit()方法,给集合添加元素
al.removeAll(newAl);//所有人的集合减去退出的集合,就获得最后剩下没有退出的那13个人
for(Iterator<Integer> it = al.iterator(); it.hasNext();){//迭代取出集合的元素
System.out.print(it.next()+" ");//打印集合的元素
}
}
private static ArrayList<Integer> getQuit() {//创建一个方法,用于获取每次退出的那个人的角标
ArrayList<Integer> newAl = new ArrayList<Integer>();//新建一个集合,用于存储退出的角标
int count = 0;//定义一个计数器,记录数数的值
//因为是一个圆圈,假定把这个圆圈拉直,把N个这样的直线连起来,就相当于永远在圆圈转圈。
for(int i = 1; i<101; i++){//因为有100人,定义一个循环次数为100的循环,i为每个人的角标
count++;//记录索引值
while(newAl.contains(i)){//判断集合是否已经添加了i
i++;//如果集合中已有那个元素,就往后加一个,再判断,直到集合中没有那个元素结束
if(i==101){//如果是第100个人的话,就从1开始
i = 1;
}
}
if(count%14==0){//如果计数器数到14,就将i添加到集合
newAl.add(i);//把这个元素加到集合去
count = 0;//把计数器置0;重新计数
}
if(i==100){//当数到第100个人的时候
i=1;//把索引置为1,1开始接着数。
}
if(newAl.size()>99)//循环终止条件:当圈子中剩余1个元素就退出循环
break;//退出循环
}
return newAl;//返回集合
}
}
复制代码
作者:
panzhenglian
时间:
2014-1-19 16:43
本帖最后由 panzhenglian 于 2014-1-19 17:07 编辑
不知道楼主是否正确,应为我验算删除掉的应该是以下数
14 28 42 56 70 84 98 //第99人报1,第100人报2,下一圈的第一人报3,不知是不是这个规则
12 27 43 58 73 88
3 19 35 51 67 83 100
17 34 52 69 87
5 23 41 61 79 97
18 38 59 78 99
21 44 64 86
8 31 54 77
2 26 50 76
4 30 57 85
11 40 71 96
32 63 93
25 62 94
33 68
7 46 82
22 66
10 53
1 48
95 49
9 65
20 81
45
15
89
60
37
24
13
6
16
作者:
panzhenglian
时间:
2014-1-19 16:47
我的代码是
import java.util.ArrayList;
/*
* 有100个人围成一个圈,
* 从1开始报数,报到14的这个人就要退出。
* 然后其他人重新开始,
* 从1报数,到14退出。
* 问:最后剩下的是100人中的第几个人?
*/
public class Test {
public static void main(String[] args)
{
ArrayList<Integer> al = new ArrayList<Integer>();
for(int x = 1; x<=100; x++)
al.add(x);
int c = 1;
Method(al,c);
for(int x = 0;x<al.size();x++)
{
System.out.println(al.get(x));
}
//System.out.print(al.size()+" ");//打印最后剩下数的长度
}
private static void Method(ArrayList<Integer> al,int c)
{
ArrayList<Integer> al2 = new ArrayList<Integer>();
for(int x = 0;x<al.size();x++,c++){
if((c % 14)==0){
al2.add(al.get(x));
//System.out.print(al.get(x)+" ");//打印每次需要排除的元素
}
}
al.removeAll(al2);
if(al.size()>13)
Method(al, c);
}
}
复制代码
作者:
panzhenglian
时间:
2014-1-19 16:49
楼主的代码结果是:1 2 10 22 23 25 33 46 58 60 76 78 92
最后我拿笔在纸上验证了一下,58应该在第二轮就没了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2