程序名称:Count3Quit.java
程序内容:
package Count3Quit;
/**
* 500个小孩,数3退1,直到剩下1个小孩,求该小孩的位置.
* 解法:定义一个boolean数组,大小为500;初始化数组全为true,当数到3时,该位置的值变为false.最后数组只有一个true.
* @author web
*
*/
public class Count3Quit {
public static void main(String[] args) {
boolean[] arr = new boolean[500];
for(int i=0; i<arr.length; i++) {
arr[i] = true;
}
int number = arr.length; //剩余人数;
int count = 0; //计数,到3清零.
int index = 0; //小孩的位置
while(number > 1) { //循环,直到剩下1个小孩.
if(arr[index] == true) { //判断小孩是否在圈内.
count ++;
if(count == 3) { //数到3,清零,并且将小孩移除圈子,即定义为false,剩下小孩减少一个
count = 0;
arr[index] = false;
number --;
}
}
index ++;
if(index == arr.length) { //数组尽头,回零.
index = 0;
}
}
for(int i=0; i<arr.length; i++) {
if(arr[i] == true) {
System.out.println("剩下的小孩在第" + (i+1) + "位");
}
}
}
}
运行结果:
程序名称:Count3Quit2.java
程序内容:
package Count3Quit;
/**
* 500个小孩,数3退1,直到剩下1个小孩,求该小孩的位置.
* 面向对象
* 使用链表的方式解决
* @author web
*
*/
public class Count3Quit2 {
public static void main(String[] args) {
KidCircle kc = new KidCircle(500);
int countNum = 0;
Kid k = kc.first;
while(kc.count > 1) {
countNum ++;
if(countNum == 3) {
countNum = 0;
kc.delete(k);
}
k = k.right; //下一位小孩
}
System.out.println("剩下的小孩在第" + (kc.first.id + 1) + "位");
}
}
class Kid {
int id; //id
Kid left; //左边的小孩
Kid right; //右边的小孩
}
class KidCircle {
int count; //人数
Kid first; //圈首小孩
Kid last; //圈末小孩
public KidCircle(int n) {
for(int i=0; i<n; i++) {
add();
}
}
/**
* 增加一个小孩
*/
public void add() {
Kid k = new Kid();
k.id = count;
if(count <= 0) {
first = k;
last = k;
k.left = k;
k.right = k;
} else {
last.right = k;
k.left = last;
k.right = first;
first.left = k;
last = k;
}
count ++;
}
/**
* 删除一个小孩
*/
public void delete(Kid k) {
if(count <=0) {
return;
} else if(count == 1) {
first = null;
last = null;
} else {
k.left.right = k.right;
k.right.left = k.left;
if(k == first) {
first = k.right;
}else if(k == last) {
last = k.left;
}
}
count --;
}
}
运行结果: