一个经典编程题目,可用各种编程语言求解

如题:有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号?

使用java求解答案:
//创建学生类,设置相关属性
public class Student {
public int index=0;   //位置编号
public int state=0;   //活动状态
Temp t;
public Student(int index,Temp t){
this.index=index;
this.t=t;
}
public void removeStu(){
System.out.println(index+"被移除了");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
t.stus.remove(this);
}
}



public class Temp {

Student stu;
int count=0;   //人数
int num =1;   //报的数
List<Student> stus=new ArrayList<Student>();

public void search(){
for(int i=0;i<17;i++){
stu=new Student(i,this);
stus.add(stu);
}

while(true){
count=stus.size();
if(count==1){
break;
}
for(int i=0;i<count;i++){
if(num%3==0){
stu=stus.get(i);
stu.state=1;
}
num++;
}

for(int i=0;i<stus.size();i++){
stu=stus.get(i);
if(stu.state==1){
stu.removeStu();
}
}
}

System.out.println("最后一个学生编号为"+stus.get(0).index);
}

public static void main(String[] args) {
Temp t=new Temp();
t.search();

}
}

你可能感兴趣的:(thread,编程,活动)