//这个问题就是一个典型的猴子选大王的问题,解决档案方案有很多,在做这个题目的时候,我直接想起来的时标记和Arraylist,下面介绍下
1 标记,也就是对每一个出列的猴子原来的数进行更改,这里更改成0,以后就不对他进行判断了。
import java.util.*;
public class Main{public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[] a=new int[n+1];
//使得数组的每一个值都跟他所在的位置相同。
for(int i=1;i<n+1;i++)a[i]=i;
int k=0;//标记3的倍数
int i=1;//标记报数报刀第几个,当报道第n+1个的时候,就把它变回到第一个。
int out_push=0;//标记出来了多少个
while(out_push<n-1){
//如果a[i]还在队里,就让k++,也就是使下一个猴子报123中的下一个数
if(a[i]!=0){k++;
}
//当某个猴子报数报道3的时候,出队,出队的变量+1,令这个的值为0.同时,使k=0。重新从1开始报数。
if(k==3){a[i]=0;
k=0;
out_push++;
}
//下一个猴子报数
i++;
//如果报数报到了4,就要回到第一个进行重新报数。
if(i==n+1){i=1;
}
}
//最后剩一个,输出
for(int j=1;j<=n;j++)if(a[j]!=0){
System.out.println(a[j]);
}
}
}
}
2
用到ArrayList
import java.util.*;
public class huiwen{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
ArrayList list=new ArrayList();
int n=sc.nextInt();
//添加元素
for(int i=1;i<=n;i++)
list.add(i);
out(list,3);
}
}
public static void out(ArrayList list,int n){
int count=0;
//当队列中不止一个时
while(list.size()>1){
//转换
Iterator tor=list.iterator();
//一圈圈的循环
while(tor.hasNext()){
//下一个
int x=(Integer) tor.next();
count++;
if(count==n){
tor.remove();
count=0;
}
}
}
//输出剩下的一个,也就是国王
System.out.println(list.get(list.size()-1));
}
}
第二种方法借鉴http://skyuck.iteye.com/blog/868930,感谢版主