有1000个小孩,每个小孩有一个编号,分别是1#-1000#,按照编号顺序从1#小孩开始依次手拉手,最后1000#小孩和1#小孩手拉手,围成一圈。现在从1#小孩开始1、2、3...报数,凡是报到7的倍数的小孩退出,最终会剩下一个小孩,请问是几号小孩。
public class Baoshu {
public static void baoshu(int n,int m)//定义一个方法,传参n为人数,当n是m的倍数时,m退出
{
boolean []children=new boolean[n];//定义长度为n的boolean数组
for(int i=0;i<children.length;i++)
{
children[i]=true;//给数组中所有小孩赋初值为TRUE
}
int cnt=n;//圈中现有人数
int num=0;//小孩所报数
int index=1;//小孩的位置
while(cnt>1)//小孩<1时结束判断
{
if(children[index]==true)//每次只判断在圈中的小孩,即状态为true
{
num++;//报数每次加一
if(num%m==0)//如果所报数对m取余为0,该小孩退出,状态为false
{
children[index]=false;
cnt--;//人数减一
}
}
index++;//小孩的位置加一
if(index==children.length)//如果小孩位置==数组长度
{
index=0;//小孩位置又从初值开始增加
}
}
for(int i=0;i<children.length;i++)//数组输出
{
if(children[i]==true)
System.out.println(i);
}
}
public static void main(String[] args) {
baoshu(6,2);
}
}
传参数为(6,2)时,即6个小孩报数,报到2的倍数的人退出。运行结果为:(剩下最后一个人为第5个人)
当传参为(1000,7)时,运行结果为:第404个人