java解决约瑟夫环

import java.util.Arrays;
import java.util.Scanner;


//有n个人围成一圈,顺序排号,从第个人呢开始报数(从1到3报数),
//凡报道3的人退出圈子,问留下的是原来第几号的那位
public class d15t{
   public static void main(String[] args) {
       Scanner sca = new Scanner(System.in);
       System.out.print("请输入总人数:");
       int p = sca.nextInt();
       /* 初始化人员 */
       boolean[] per = new boolean[p];// boolean数组表示站成一圈的人,false表示退出
       for (int i = 0; i < per.length; i++) {
           per[i] = true;
       }

       /* 报号 */
       int t = 0, len = per.length;//初始化长度len和序号t
       while (len > 1) {//当长度大于一进语句,只剩一个人时才退出
           for (int i = 0; i < per.length; i++) {

               if (per[i]) {
                   t++;//序号每次加1
                   if (t == 3) {//当序号为3时,执行以下语句
                       t = 0;//将t设置为0,重新从1-3报号
                       per[i] = false;//把t等于三时的布尔数组
                                       //位置设置为false,当作为人的退出
                       len--;//每次数到三时长度减一
                  }
             }
           }
       }
       /* 结果 */
      // System.out.println("最后的情况:" + Arrays.toString(per));
       for (int i = 0; i < per.length; i++) {
           if (per[i]) {//遍历布尔数组,为true的输出
           //i为索引位置,i+1为实际位置:既从一开始数的位置,除三取余为原来的序号
              System.out.println("原来为:" + (i + 1) % 3+"号");
           }
      }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值