问题:
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3,凡是报到3的人退出圈子,问最后留下的是原来第几号的那位。
分析:
n个人围成一圈,首先想到的就是,用循环加数组,把n个人从一到n编号,顺序放在数组里面,然后定义一个变量用来记录出圈的人数,一次用来当做结束循环的条件,既:当退出圈的人数+1,等于总人数,也就是只剩下一人时,结束循环。
编号从1开始,退出的人用0覆盖其编号,在循环里判断,当数组内容为0时,不在报数。
设一个变量k用来计数,从1到3,之后从新开始从1到3,当数组内容为0时,表示此人已退出,跳过报数。
PS:这样做的原因是因为数组的长度是固定的,不能移除,所以只能用0覆盖。
废话不多说,上代码
public static void main(String[] args){
int[] a=heihei(5);
System.out.print("最后剩下的人的编号为:");
for(int i=0;i<a.length;i++){
if(a[i]!=0){
System.out.println(a[i]);
}
}
}
public static int[] heihei(int n){
//初始化数组,用来存放n个数
int[] a=new int[n];
//for循环向数组里面填数
for(int i=0;i<n;i++){
a[i]=i+1;
}
int i=0;//数组里面内容的坐标,a[i]
int k=0;//用来计算是否到了3次
int qunit_Num=0;//出圈的人数
//直到出圈的人数+1=n-1,也就是数组里面只剩下一个非0的数时,结束循环
while(qunit_Num<n-1){
//a[i]!=0.表示这个数还没有出圈,k要进行+1,也就是说ta需要报数。
if(a[i]!=0)
k++;
//当k==3时,把a[i]=0,代表ta出圈啦,不在参与报数。
if(k==3){
a[i]=0;
qunit_Num++;//出圈的人数+1
k=0;//k复位。从新查数1,2,3,,,,,,
}
i++;//i+1,向后走一位,进入下次循环,让下一位报数
//如果i==n,表示已经轮换一圈,则i复位,从新开始
if(i==n)
i=0;
}
return a;
}