今天在一个论坛看到有人问一个很老的问题。
“10个人围一圈,编号为1的人开始数数,数到能被3整除的编号的人退出,然后再往下数。问最后剩几个人?
如第一圈后:3,6,9退出,还剩7人下一圈从第11开始数。求算法”
看到过这个题目很多次,从来都没有仔细想过写过代码。
下面的方法是我今天看到题目后的第一反应,应该有更好的吧。
你们都是怎么做的啊,学习一下,谢谢啦!
我算法很弱的。。。
一、数组实现
1. for循环初始化每个人的值为0
2. 开始报数,如果所报之数能被3整除,设置此人的值为1
3. 如此循环下去,直到只有一个人的值为0
4. 获得此人在数组中的下标,加1之后输出,即为所求
package
Test;
public class Main {
public static void main(String[] args) {
int [] person = new int [ 10 ];
for ( int i = 0 ; i < person.length; i ++ ) {
person[i] = 0 ;
}
for ( int j = 0 , count = 0 , leave = person.length; leave != 1 ; j = (j + 1 ) % (person.length)) {
if (person[j] == 1 ) {
continue ;
} else {
count ++ ;
if (count % 3 == 0 ) {
person[j] = 1 ;
leave -- ;
}
}
}
for ( int i = 0 ; i < person.length; i ++ ) {
if (person[i] == 0 ) {
System.out.println( " The last person is " + (i + 1 ));
return ;
}
}
}
}
public class Main {
public static void main(String[] args) {
int [] person = new int [ 10 ];
for ( int i = 0 ; i < person.length; i ++ ) {
person[i] = 0 ;
}
for ( int j = 0 , count = 0 , leave = person.length; leave != 1 ; j = (j + 1 ) % (person.length)) {
if (person[j] == 1 ) {
continue ;
} else {
count ++ ;
if (count % 3 == 0 ) {
person[j] = 1 ;
leave -- ;
}
}
}
for ( int i = 0 ; i < person.length; i ++ ) {
if (person[i] == 0 ) {
System.out.println( " The last person is " + (i + 1 ));
return ;
}
}
}
}
本文转自BlogJavaOo缘来是你oO的博客,原文链接:一道很简单的老问题,求更好的解决方法,如需转载请自行联系原博主。