约瑟夫问题(二)出圈

结合约瑟夫问题(一)

public void chuquan(int nums,int start,int k){ //nums:总人数;start:从第start号的小孩开始报                                                                              数;k:报几个数
        if(first==null||start<1||start>nums) {    //
            System.out.println("重输");
        }
        Boy helper=first;                                       //创建helper指针,让它指向最后节点
        while(true) {
            if(helper.getNext()==first) {
                break;
            }
            helper=helper.getNext();
        }
        for(int i=0;i<start-1;i++) {      //第start号小孩报数,first,helper移动start=1下
            first=first.getNext();
            helper=helper.getNext();
        }
        while(true) {
            if(helper==first) {                    //最后圈里只剩一个小孩
                break;
            }
            for(int j=0;j<k-1;j++) {
                first=first.getNext();
                helper=helper.getNext();
            }
            System.out.printf("%d小孩出圈\n",first.getNo());
            first=first.getNext();
            helper.setNext(first);              //把first向下一个节点移动,使原first节点删除

            
        }
        System.out.println("最后留在圈里的是%d小孩");
        
        
    }

结果:

nums=5,start=1,k=2

2小孩出圈
4小孩出圈
1小孩出圈
5小孩出圈
最后留在圈里的是3小孩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值