1. 程式人生 > >數三退一 二種方式的演算法 Java

數三退一 二種方式的演算法 Java

數三退一,就是指很多個小朋友圍成一個圈,從第一個開始數1.2.3. 第三個小朋友就退出 這個圈,以此類推。

第一種方法,以面向過程的方式,此程式的案例十500個小朋友,

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 leftCount=arr.length;
int countNun=0;
int index=0;
while(leftCount>1){
if(arr[index]==true){
countNun++;
if(countNun==3){
countNun=0;
arr[index]=false;
leftCount--;
}
}
index++;
if(index==arr.length){
index=0;
}
}


for(int i=0;i<arr.length;i++){
if(arr[i]==true){
System.out.println(i);
}
}
}

}

第二種方法是面向物件的思維

public class Count3quit2 {
public static void main(String[] args) {
kidCirle a=new kidCirle(500);
int countNun=0;
kid k=a.frist;
while(a.count>1){
countNun++;
if(countNun==3){
a.delete(k);
countNun=0;
}
k=k.right;
}
System.out.println(a.frist.id);
}
}
class kid{
int id;
kid left,right;
}
class kidCirle{
int count=0;
kid frist,last;

kidCirle(int n){
for(int i=0;i<n;i++){
add();
}
}
void add(){
kid k=new kid();
k.id=count;
if(count<=0){
k.left=k;
k.right=k;
frist=k;
last=k;
}else{
k.right=frist;
k.left=last;
frist.left=k;

last.right=k;
last=k;
}
count++;

}
void delete(kid k){
if(count<=0){
return;
}
if(count==1){
frist=last=null;
}else{
k.left.right=k.right;
k.right.left=k.left;
if(k==frist){
frist=k.right;
}else if(k==last){
last=k.left;
}
}
count--;
}


}