问题
假设有10个人围成一圈,从第一个人开始报数,数到3的人,就要被杀掉。依次循环下去。直到只剩下一个人,那么是第几个人存活?
以上问题转换成编程语言,有四点:
1.编号
2.步长
3.删除
4.循环遍历直到剩下一个人
法一:用数组
- 1.编号:用数组的索引
- 2.步长:用计数器 count
- 3.删除元素:用数组的数值value
(当数组元素的值为1时,则存活,为0时则不存活,实际上元素并没有被删去,只是做了标记而已) - 4.循环遍历数组:可以用“index++,当index=数组长度时,index=0”的方法
/*
* 经验:
* 1.跟编号有关的:用数组的索引
* 2.跟状态,分组,分类有关的:用数组的数值value
* 3.循环遍历数组:可以用“index++,当index=数组长度时,index=0”的方法
* 4.小范围遍历数组可以用计数器 count
*/
public class TestJosephLoop {
public static void main(String[] args) {
int total=10;
int m=3;
int winner = joseph(total,m)+1;
System.out.println("编号为"+winner+"的人会活下来");
}
private static int joseph(int total,int m) {
//定义一个数组,表示人的状态:1代表在列,0代表出列
int[] peopleflag = new int[total];
for(int i=0;i<total;i++) {
peopleflag[i]=1;
}
int peoplelive=total; //在列的人数,初始值为total
int index=0; //索引号index用于循环遍历数组,当index==total时,归零
int count = 0; //计数器,初始值为0
//循环遍历数组,当数组只有一个数状态为1时,退出循环
while(peoplelive>1) {
if(peopleflag[index]==1) {
//只有状态为1,在列的元素才能参与数数
count++; //每有一个人数数,计数器加1
if(count == m) {
//如果数数数到了m,一个小循环结束,该人出列(标记为0,即数值写为0)
peopleflag[index]=0;
count=0; //