josephus约瑟夫环问题


import java.util.Scanner;
//约瑟夫环
public class josephus {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();//一共多少人
        int s = scan.nextInt();//开始位置
        int d = scan.nextInt();//每个循环多少人
        jose(n,s,d);
    }
    public static void jose(int n,int s,int d){
        int [] q = new int[n];
        int [] st = new int[n];//st数组表示这个人有没有被删掉,出局
        for(int i = 0; i < n; i ++ ){
            q[i] = i;//人的编号从0开始
        }
        int cnt = 1;//记录d的循环
        int x = 0;//用于判断是否最后一个人
        for (int i = s; i < n; i = (i + 1) % n){
            if(x == n - 1)  break;//如果到最后一个人了,就直接break
            if(cnt != d && st[i] == 0){//这个人没有被删掉且cnt不是d
                cnt ++;
            }
            else if(cnt == d && st[i] == 0){//如果cnt==d并且当前这个人没有被删掉
                st[i] = 1;//那么让他的状态变成1,表示出局了
                System.out.println(i);//输出出局的人
                cnt = 1;//让cnt重置
                x ++;//出局人数加1
            }
        }
        System.out.print("剩下的是");
        for(int i = 0; i < n; i ++){
            if(st[i] != 1){
                System.out.print(i);
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值