当前位置:编程学习 > JAVA >>

n个人围成一圈按照1,2,3..n报数,数到n的人依次站出来求站出来的人位置。

n个人围成一圈按照1,2,3..n报数,数到n的人依次站出来求站出来的人位置。 --------------------编程问答-------------------- 站出来,然后n-1个人,再数n是把? --------------------编程问答-------------------- 要是第一个报数的人不变,不就是n n-1 n-2.。。。 --------------------编程问答-------------------- 递归!!! --------------------编程问答-------------------- 如果是按我说的,实现是这样的:

import java.util.ArrayList;
import java.util.List;


public class NPeople
{

    //总人数设置
    private static final int N = 5;

    public static void main(String[] args)
    {
        //n个人的编号
        List<Integer> nList = new ArrayList<Integer>();
        //初始化
        for (int i = 1; i <= N; i++)
        {
            nList.add(i);
        }

        showGetOutPeoples(nList, N);
    }

    /**
     * N个人报数N,N出列
     * @param list
     * @param n2
     */
    private static void showGetOutPeoples(List<Integer> list, int n2)
    {
        //计数器
        int counter;
        //出列下标
        int index = 0;
        for (int size = list.size(); size > 0; size--)
        {
            counter = 0;
            while (counter++ < N-1)
            {
                ++index;
                index = index % size;
            }
            System.out.println("第" + N + "个人出列,编号为:" + list.remove(index));
            
            //对index调整
            if (index >= size)
            {
                index = 0;
            }
        }
    }
}
--------------------编程问答-------------------- 约瑟夫出圈
刚学java时的问题
package day;
import java.util.Scanner;
public class Chuquan {

/**
 * 约瑟夫环的实现
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
               //此程序被踢的人还在自己的位置,这样不管转多少圈,都能很方便的知道自己原先的位置

        System.out.println("请输入总人数n:");   //输入总人数
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
       
        System.out.println("请输入要出圈的数值m:");    //输入出圈的数值     
        int m=sc.nextInt();
        System.out.println("出圈顺序是:");        
        int[] a=new int[n];
        int ren=n;        //当前圈子总人数,初始值为n
        for(int i=0;i<a.length;i++) //为人编号1--n入组
            a[i]=i+1;
        int i=0;          //数组下标
        int j=1;         //标记 当前报数 从1开始,到m后,重置为1,继续
        while(ren>0){                  //圈内有人
            if(a[i%n]>0){      // 这里指还在圈的人      i%n   为保证连环  i一直增,否则只执行一轮       而%n 保证其是原来最初位置
                if(j%m==0){    //满足条件能被整除,跳出圈并输出原先位置
                    System.out.print(a[i%n]+"  ");  
                    a[i%n]=0;     //ciren被踢 置为0
                    j=1;           //重置,使下一个报1
                    i++;
                    ren--;        
                }
                else{
                    i++;          //不满足条件,正常按序报数
                    j++;
                }
            }
            else{//遇到被踢的人了,此人已死 ,跳到下一位,j不加一,死人不能报数 
                i++;
            }
        }
    }
    
}








补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,