约瑟夫环问题

    //约瑟夫环问题
    // N个人,编号从1~N围成一圈,输入一个数,从1号开始报数,报到m的人出圈;下一人又从1开始报数,下一个报到m的人出圈,输出出圈顺序。
    //怎么找到出圈的数,1)遍历原数组对m求余为0的元素输出,那么循环第二遍数据怎么处理 2)循环计数对m求余或者判断是否相等
    //找到出圈的数怎么处理,1)删除,操作麻烦 2)元素标记,循环计数过滤掉此项
    //遍历到数组末尾,怎么回到数组开头, 计数对N求余,容易循环取到元素下标

   
       public void demo(){
    //约瑟夫环问题
    // N个人,编号从1~N围成一圈,输入一个数,从1号开始报数,报到m的人出圈;下一人又从1开始报数,下一个报到m的人出圈,输出出圈顺序。
    //怎么找到出圈的数,1)遍历原数组对m求余为0的元素输出,那么循环第二遍数据怎么处理 2)循环计数对m求余或者判断是否相等
    //找到出圈的数怎么处理,1)删除,操作麻烦 2)元素标记,循环计数过滤掉此项
    //遍历到数组末尾,怎么回到数组开头, 计数对N求余,容易循环取到元素下标

    int N = 5 ;
    int m = 4;
    if(N<=0 || m<=0){
        System.out.println("数据错误");
    }

    List<Integer> flagList = new ArrayList();
    for(int i = 0;i<N ;i++){
        flagList.add(0);
    }
    int s = -1, i = 0,count = 1;
    while(true){
        s = (s+1)%N;
        if(flagList.get(s)==0){
            i++;
        }
        if(i==m){
            i = 0;
            flagList.set(s,count++);
            System.out.println(s+1);
        }
        if(count>N){
            break;
        }
    } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值