日期:2014-05-20  浏览次数:20700 次

josepbus 环
问题!
    一群小孩围成   一圈,任意假定一个书m,从每个小孩起,顺时针方向数,每数到m个小孩时,该小孩便离开,小孩不断离开,圈子不断地缩小,最后剩下的一个小孩便是胜利者,求解究竟胜利者是第几个小孩?  

解答这个问题,首先要定义一个数组,其元素个数就是小孩个数,必须预先设置小孩个数常量,以便定义数组  

对每个小孩赋以一个序号值作为小孩标志,由于数组是局部作用域的,一旦分配之后,就无法删除,等到作用域结束才会自动抹去,所以当小孩离开时,只能修改数组元素值来标识小孩的离开  

数组是线性排列的,用数组表示小孩围成圈,要有一种从数组尾部跳以首部的技巧,这就是加一求模,当数到数组尾部的时候,下一个数组下标算出为0,从而回到数组首部,继续整个过程  

(1)对小孩数用常量定义,这样数组定义的大小就可以用此常量表示,用一个循环给小孩编号,依次为1,2,3......不管有几个小孩,小孩的编号只与小孩个数有关  

(2)随机给出m,它的值应大于0,小于小孩的总数  


------解决方案--------------------
用向量或链表,也许更方便点
------解决方案--------------------
import java.util.Vector;
public class josepbus
{
public static void main(String[] args)
{
int n=4; //小孩数
int m=2; //m值
Vector v=new Vector();
for(int i=0;i <n;i++)
{
String str= "小孩子编号: "+(i+1);
v.addElement(str);
}
int s=0; //当前小孩序号
for(int i=1;i <n;i++)
{
int l=v.size();
s=s+m-1;
System.out.println( "移除小孩序号为 "+(s%l)+ ", "+v.get(s%l));
v.remove(s%l);
}
System.out.println( "胜利的小孩子: "+v.firstElement());
}
}
运行结果:
移除小孩序号为1,小孩子编号:2
移除小孩序号为2,小孩子编号:4
移除小孩序号为1,小孩子编号:3
胜利的小孩子:小孩子编号:1

------解决方案--------------------
第规和循环都可以实现,很老的经点问题了
------解决方案--------------------

Vector <String> v=new Vector <String> ();

这样就没事了