一群人围成一个圈,依次1,2,3,4报数,数到4的人出列,求最后出列的哪个人!
谢谢。
题目就是这样。。
希望知道的人给个Java代码答案!

解决方案 »

  1.   

    类似于“猴子选大王”的算法,网上很多这种实例,GOOGLE上很多的,以前我用环型链表做过这个算法,等晚上回家去看看代码还在的话给你发上来。
      

  2.   


    #define nmax 50
    main()
    {
    int i,k,m,n,num[nmax],*p;
    printf("please input the total of numbers:");
    scanf("%d",&n);
    p=num;
    for(i=0;i<n;i++)
     *(p+i)=i+1;
     i=0;
     k=0;
     m=0;
     while(m<n-1)
     {
     if(*(p+i)!=0) k++;
     if(k==4)
     { *(p+i)=0;
     k=0;
     m++;
     }
    i++;
    if(i==n) i=0;
    }
    while(*p==0) p++;
    printf("%d is left\n",*p);
    }
      

  3.   

    package SmartUpload;
    import java.util.*;public class yang {
       List lst=new ArrayList();
      
    public List  test(){
    for(int j=1;j<=100 ;j++){lst.add(j);}
     int k=0;  while(lst.size()>1){
      for(int j=0;j<lst.size();j++) 
      { k++;
       if(k==4){
         lst.remove(j);
         j=j-1;
         k=0;
        }}}
      
    return lst;
    }
    public static void main(String[] args) {
    yang yang = new yang();
    System.out.println(yang.test().get(0).toString()   ) ;
    }}
      

  4.   


        //n个人 第out出列
        static void circle(int n,int out){
         int []arr=new int[n];
         int index=0;
         int count=0;
         int outCount=0;
         while(true){
         if(arr[index]==0){
         count++;
         if(count%out==0){
         if(outCount==n-1){
         System.out.println("最后出列:"+(index+1));
         return;
         }
         arr[index]=1;
         outCount++;
         }
         }
         index=(index+1)%n;
         }
        }
      

  5.   

    public class test
    {
        private int getPerson(List list)
        {
            int index = 0;
            for(int i = 1;i<=list.size();i++;)
            {
                 这个意思是如果i%4==0说明当前为应该出列的那个人,这样就三删除它。
                 if(i%4 ==0)
                 {
                     list.remove(i);
                 }
                 这里index的值就为最后一个删除的人的索引。
                 index = i;
            }
            由于循环一遍所删除的个数仅为list的总长度除以4的值,因为是一个圈,所以继续对list进行循环。直到里面没有已经没有4个以上元素位置
             这个时候循环就返回最后一个被删除的索引。
            if(list.size()>4)
            {
                getPerson(list);
            }
            return index;
        }
        public static void main(String[] args)
        {
            Test t = new Test();
            //n为你人的总数
            int n = 25;
            List<Integer> list = new Integer<Integer>();
            由于list的索引是从0开始,所以这里先为这个list添加一个站位置的值,这个值没有任何意义,为了方便在方法里面计算
             真正的人的索引是从1开始的,这样在上面的循环中就从1开始判断。了
            list.add(0);
            for(int j = 1;j<=n;j++)
                 list.add(j);
            t.getPerson(list);
            
        }
    }
      

  6.   

    //假设为500个人
    public class  Count4Quit
    {
    public static void main(String[] args) 
    {
    boolean[] arr = new boolean[500];
    for(int i=0;i<arr.length;i++)
    {
    arr[i] = true;
    }
    int leftCount = arr.length;
    int countNum = 0;
    int index = 0; while (leftCount >1)
    {
    if(arr[index] == true)
    {
    countNum++;
    if(countNum == 4)
    {
    countNum = 0;
    arr[index] = false;
    leftCount --;
    }
    }

    index++; if(index == arr.length)
    {
    index = 0;
    }
    } for(int i=0;i<arr.lenght;i++)
    {
    if(arr[i] == true)
    {
    System.out.println(i);
    }
    }
    }
    }