*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: 弑神饕餮 QQ:468013111
*/ 时间: 2007-7-25 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
今天基本上都耗在这个题上了,有所感悟,觉得有些东西值得再三考虑之后再动手来做,先让我们来看这个小程序,再告诉大家我为什么有此感悟~~~
题目是这样的:一群小孩围成一圈,任意假定一个数m,从每一个小孩起,顺时针方向数,每数到m个小孩时,就将该小孩T出去,然后从下一个继续数,小孩不断离开,圈子不断缩小。最后剩下的那个就是胜利者。求解最后胜利的是第几个小孩。题目要求:用数组来做。
这是我一开始写得代码,错了~~~大错特错~~~
public class josephus {
public static void main (String[] args) {
int sum=0;
int m=3;
int a[]={0,1,2,3,4,5,6,7,8,9};
for(int i=0;sum<9;i+=3){
while(i>9){
i-=10;
}
while(a[i]==10){
i++;
}
a[i]=10;
sum++;
}
for(int i=0;i<10;i++){
if(a[i]!=10) System.out.println("the winner is "+a[i]);
}
}
}
做出来之后我很兴奋,谁知道一试结果得不到我所要的结果,我很沮丧,下午,我静下心来,重新看了好多便代码终于发现了一个致命的错误,使我的代码完全就是错误的~~~于是我重写了代码,我怀着虔诚,虚心的态度改了又改,终于让我做出另我满意的程序(如下),我又好高兴好高兴~~~
public class xiaohai {
public static void main (String[] args) {
final int M=3,N=10;//M为指定个数,N为小孩的个数
int a[]=new int[N];
int n=0,sum=0;//n与M搭配 sum为被T出小孩的个数
for(int i=0;sum<N-1;i++){
if(i>N-1) i=0;
while(a[i]==10){
i++;
if(i>N-1) i=0;
}
while(a[i]!=10){
n++;
if(n==M){
sum++;
n=0;
a[i]=10;//若被T出则另a[i]=10 作为标志
}
i++;
if(i>N-1) i=0;
}
}
for(int i=0;i<N;i++){
if(a[i]!=10) System.out.println("the winner is "+i);
}
}
}
然后,高兴过后,我又仔细思考了我前一个题的致命错误,想了一下,如果用jdk1.5中的list容器,就不会出现这样的错误,而且代码会变得清晰明了,所以又打算用list来重写代码,可是想到自己对容器还不熟悉,所以没写,但让我悟出了开头说的道理——有些东西值得再三考虑之后再动手来做~~~