Java基础题(用数组和循环解决)——15只鸭子围成一圈,依次报数,报到7被淘汰,最后剩下的鸭子成为鸭王,求鸭王为第几只?

这篇博客探讨了一个有趣的编程问题:15只鸭子围圈报数,报到7的被淘汰,直至剩下最后一只鸭王。文章通过Java代码详细解释了如何使用数组和循环来解决这个问题,重点在于数组的运用和do-while循环的实现,最终找出鸭王的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

根据题目要求,我们需要知道那只鸭子被淘汰。
我们需要知道的变量有:1.十五只鸭子的序号 2. 报出的数字

因此,我们需要知道每只鸭子的位置,即在数组中的位置,或者说是数组的下标值。 此外,我们还有一个循环,循环报数1,2,3....报到7就开始第二轮循环。

首先,我们先定义一个数组,用来储存鸭子的位置和序号。

int[] ducks = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

接着我们对数组进行遍历,来排除报7的鸭子。

for (int i=1;i<=15;i++){
            //1-7循环报数,报7的淘汰。换句话来说,持续报数,报到7的倍数被淘汰
            //所以直接对报的数字取余即可
            if (i%7==0){
                //淘汰报到7的狮子被淘汰,即为0
                ducks[i-1]=0;//数组下标从零开始,所以需要减一
            }
        }
System.out.println(Arrays.toString(ducks));//打印数组

代码执行结果:

 如图,序号为7,14的鸭子报到了7,数值被改为0,即这两只鸭子被淘汰了。

但是这样报数,只循环了两轮,我们需要一直循环下去。由于我们并不知道需要循环多少次,所以我们应该采用do-while循环。

        int num = 1;//报出的数字
        int index = 0;//记录下标
        do {
            //初始化index,当下标大于等于15的时候,从零开始
            if (index >= ducks.length) {
                index = 0;
            }
            //初始化num,当鸭子报的数字到7的时候,从一开始
            if (num > 7) {
                num = 1;
            }
            //如果鸭子已经被淘汰,此时序号值为0,应当跳过报数
            if (ducks[index] == 0) {
                index++;
                continue;
            }
            //当num值为7,此时对应的鸭子被淘汰,序号值记为0
            if (num == 7) {
                ducks[index] = 0;
            }
            index++;//数组下标继续增加
            num++;//报的数值增加

            //当还剩一只鸭子的时候,这只鸭子就成为了鸭王,跳出循环

            int count = 0;//记录被淘汰的狮子个数

            for (int i = 0; i < ducks.length; i++) {
                if (ducks[i] == 0) {
                    count++;//有一只被淘汰,就记录一个
                }
                //如果被淘汰了14只鸭子,那么鸭王就选出来了
                if (count == 14) {
                    //遍历找到最后一只鸭子当鸭王
                    for (int duck : ducks) {
                        if (duck != 0) {
                            System.out.println(duck);//打印输出最后的鸭子序号
                        }
                    }
                    System.exit(0);//结束程序
                }
            }
        } while (true);

最后运行的结果:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值