- 问题:有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));
}
}
}
}
- 结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a1abbf2aebd14d77946ee333a32de43a.png)
- 总结:在进行问题的测试时,由于我们不可能知道500人,那个人会留下,可以先从第5个人测试,看程序是否符合条件。选择5个人,因为我们可以手动算出其留下的是哪位,可以判断程序的正确性