5.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
时间: 2023-03-21 13:00:39 浏览: 113
假设有 n 个人围成一圈,顺序排号,从第一个人开始报数,凡报到 3 的人退出圈子。则最后留下的人是原来的第 x 号。
我们可以模拟这个过程。假设当前还剩下 k 个人,第一个人报数为 1,则当前应该退出圈子的人的编号为 (1+3-1) % k = 3 % k。
我们可以递归地求解这个问题。设 f(k) 表示 k 个人围成一圈,最后留下的人的编号,则有:
f(1) = 0 // 只剩下一个人,编号为 0
f(k) = (f(k-1) + 3) % k // k 个人围成一圈时,最后留下的人的编号
最终的答案即为 f(n)。
相关问题
有n个人围成一圈顺序排号java_:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。...
这道题可以使用约瑟夫环算法来解决。具体做法如下:
1. 创建一个长度为n的数组,表示n个人是否还在圈子中,初始值都为true。
2. 从第一个人开始报数,每报到3的人就将他的状态改为false,然后重新开始报数。
3. 循环执行步骤2,直到只剩下一个人为止。
4. 遍历数组,找到最后一个状态为true的人,就是最后留下的人。
Java代码实现如下:
```java
public static int lastRemaining(int n) {
boolean[] people = new boolean[n];
Arrays.fill(people, true);
int count = 0, index = 0, left = n;
while (left > 1) {
if (people[index]) {
count++;
if (count == 3) { // 报到3
people[index] = false;
count = 0;
left--;
}
}
index++;
if (index == n) { // 循环遍历
index = 0;
}
}
for (int i = 0; i < n; i++) { // 找到最后一个人
if (people[i]) {
return i + 1;
}
}
return -1;
}
```
其中,n表示圈中的人数,返回最后留下的人的原来编号。
4. 有 n 个人围成一圈,顺序排号。从第 1 个人开始报数(从 1 到 3 报数), 凡报到 3 的人退出圈子,问最后留下的是原来第几号的人
这是一个经典的约瑟夫问题,最后留下的人的编号与初始人数有关。
当初始人数为 n 时,最后留下的人的编号为:
f(n) = (f(n-1) + k) % n
其中,f(n) 表示 n 个人时最后留下的人的编号,k 表示从第一个人开始报数,每次报到第三个人时退出,也就是 k=3。
初始情况下,第一个人的编号为 0,因此可以使用递归的方式求解。
以下是使用 Python 实现的代码:
```python
def last_remaining(n):
if n == 1:
return 0
else:
return (last_remaining(n-1) + 3) % n
n = 10
print("初始人数为", n, "时,最后留下的人的编号为", last_remaining(n))
```
输出结果为:
```
初始人数为 10 时,最后留下的人的编号为 4
```
阅读全文