n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。设计并编写程序,实现如下功能:
(1) 要求由用户输入开始时的猴子数n、报数的最后一个数m。
(2) 给出 当选猴王的 初始 编号。
(1) 要求由用户输入开始时的猴子数n、报数的最后一个数m。
(2) 给出 当选猴王的 初始 编号。
//思路: 1: 生成一个数组,从 1 到 n;
2: 设置一个计数器 ; (判断是否应该淘汰 ); 初始计数器为 0;
将数组第一个元素拿出, 计数器加一; 判断 计数器的数 是否等于 m , 如果不等于将其追加到
数组末尾( 此时元素已经从开头移除, ), 如果等于m 不作处理(注: 此时元素已经从开头移除,不做处理即为删除
此元素) , 再去取开头的元素(重复至还剩一个元素 即为大王);
<pre name="code" class="java">package testtry;
import java.util.*;
public class monkeyking {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("请输入猴子的个数");
int mnum = sc.nextInt();
System.out.println("请输入淘汰的 数");
int onum = sc.nextInt();
//生成一个linedlist对象
LinkedList mlist = new LinkedList();
//add方法为 add(下标,元素);
for(int w=0;w<mnum;w++){
mlist.add(w, w+1);
}
//执行到这,形成一个数组 [1,2,3,4,5,6,n]; 即猴子的个数
int fnum = 0; //定义一个计数器,纪录报数
/**
当数组 元素的个数 大于 1时,报数,淘汰
(即 当数组元素个数为 1 个时,跳数循环,且此时数组中仅有一个元素)
**/
while(mlist.size() > 1){
//移除开头的元素,并将其值赋给一个对象
Object a = mlist.remove();
fnum++; // 将开头的猴子拿出,计数器加 1
if(fnum < onum ){
//如果猴子 报的数 小于 淘汰数, 将猴子移到末尾,(它还可以报数)
mlist.add(a);
}
if(fnum == onum ){
//如果猴子 报的数 是 淘汰数,
//不将其移到末尾,即为删除, 计数器归零, 同时重新开始报数
fnum = 0;
}
}
System.out.println(mlist); //执行完while循环,此时数组中 只有一个 元素(即为大王);
}
}