手拉手围圈问题

  • 问题:有500个小孩手拉手围成一圈,从1开始数,数3小孩退出圈外,直到最后一位小孩,求最后一位小孩的序号是?
  • 思路:
    • 创建一个整型数组,数组不赋值,则会默认给0;可以利用数组存储的数值为0,则表示没有出局,如果该位置的小孩出局了,就在相应位置赋值为1,代表出局了
    • 给一个num的数值,进行数的数字,如果数字是num%3==0,则表示数到三了,该位置的人要淘汰
    • 可以用while循环,当淘汰人数是499个时,就退出,否则for循环数组里面的值,该值为0,则数该位置,否则跳过。每num%3 == 0,则赋值为1.
    • 每循环一次,其计算数的num重置为其num % 3,是为了接着上一次数的数,可以继续数,因为题目是围成一圈的。
      代码实现:
public class Test3 {
    public static void main(String[] args) {
        //8:有500个小孩手拉手围成一圈,从1开始数,数3小孩退出圈外,直到最后一位小孩,求最后一位小孩的序号是?
        int[] arr = new int[500];
        //数的数字,当作踢出去的判断
        int num = 0;
        //被踢出去的小孩数
        int count = 0;
        while(true){
            if(count == arr.length - 1){
                break;
            }
            for(int i = 0;i < arr.length;i++){
                //判断相应位置是否为0,为0则在场上
                if(arr[i]==0){
                    num++;
                    //判断第三位
                    if(num%3 == 0){
                        arr[i] = 1;
                        count++;
//                        System.out.println("踢出去");
                    }
                }
            }
            num = num%3;
        }
        //看那个小孩没出局
        for (int i = 0;i<arr.length;i++) {
            if(arr[i] == 0){
                System.out.println("剩下小孩的序号为"+(i+1));
            }
        }
    }
}

  • 结果:
    在这里插入图片描述
  • 总结:在进行问题的测试时,由于我们不可能知道500人,那个人会留下,可以先从第5个人测试,看程序是否符合条件。选择5个人,因为我们可以手动算出其留下的是哪位,可以判断程序的正确性
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值