java n只猴子选大王,选举方法如下:所有猴子按1、2、……n的顺序围坐一圈,从第1个猴子开始报数,报到m的退出圈子。如此循环报数,直到圈中只剩下一只猴子,即为大王
时间: 2023-05-19 07:03:03 浏览: 168
这是一个经典的约瑟夫问题,可以使用递归或循环来解决。以下是使用循环的解决方案:
```java
public static int findMonkeyKing(int n, int m) {
int king = 0;
for (int i = 2; i <= n; i++) {
king = (king + m) % i;
}
return king + 1;
}
```
其中,n表示猴子的数量,m表示报数的间隔。函数返回最后一只猴子的编号,即为大王的编号。
相关问题
用Java n只猴子选大王,选举方法如下:所有猴子按1、2、……n的顺序围坐一圈,从第1个猴子开始报数,报到m的退出圈子。如此循环报数,直到圈中只剩下一只猴子,即为大王,请编程实现。
好的,这是一个经典的约瑟夫问题,可以使用链表来模拟猴子围成的圈。以下是Java代码实现:
```
import java.util.*;
public class MonkeyKing {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入猴子的数量n:");
int n = sc.nextInt();
System.out.print("请输入报数的数字m:");
int m = sc.nextInt();
sc.close();
LinkedList<Integer> monkeys = new LinkedList<>();
for (int i = 1; i <= n; i++) {
monkeys.add(i);
}
int count = 1;
while (monkeys.size() > 1) {
int monkey = monkeys.removeFirst();
if (count % m != 0) {
monkeys.addLast(monkey);
}
count++;
}
System.out.println("大王是第" + monkeys.getFirst() + "只猴子。");
}
}
```
这个程序可以接受用户输入猴子的数量n和报数的数字m,然后使用LinkedList来模拟猴子围成的圈。每次从链表头部取出一个猴子,如果它的报数不是m的倍数,就把它放到链表尾部,否则就把它从链表中删除。最后剩下的那只猴子就是大王。
java实现n只猴子选大王,选举方法如下:所有猴子按1、2、……n的顺序围坐一圈,从第1个猴子开始报数,报到m的退出圈子。如此循环报数,直到圈中只剩下一只猴子,即为大王,请编程实现。
好的,这是一个经典的约瑟夫问题,可以使用链表来模拟猴子围成的圈。以下是Java代码实现:
```
import java.util.*;
public class MonkeyKing {
public static int findKing(int n, int m) {
LinkedList<Integer> monkeys = new LinkedList<>();
for (int i = 1; i <= n; i++) {
monkeys.add(i);
}
int index = 0;
while (monkeys.size() > 1) {
index = (index + m - 1) % monkeys.size();
monkeys.remove(index);
}
return monkeys.get(0);
}
public static void main(String[] args) {
int n = 5;
int m = 3;
int king = findKing(n, m);
System.out.println("The king is monkey " + king);
}
}
```
在这个实现中,我们使用了LinkedList来表示猴子围成的圈,每次找到需要退出的猴子的位置,然后将其从链表中移除。最后剩下的那只猴子就是大王。
阅读全文