根据题目要求,我们需要知道那只鸭子被淘汰。
我们需要知道的变量有: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);
最后运行的结果: