n个人围成一圈,按1到n的顺序编号。从第一个人开始报数(从1到m报数),凡报到m的人退出圈子,问最后留下的是原来的第几号。 输入 首先输入两个正整数n和m,n表示n个人围一个圈子(n>=2),m表示从1报数到m的人退出圈子(1=<m)。 输出 最后剩下的人的编号。 样例输入 复制 2 3 样例输出 复制 2
时间: 2024-02-21 09:58:24 浏览: 38
这也是一个经典的约瑟夫问题,可以用模拟的方法解决。具体做法是:
1. 把n个人围成一个圈,编号从1到n。
2. 从第一个人开始报数,报到m的人出圈,圈子缩小为n-1个人。
3. 重复第2步,直到圈子缩小为1个人为止,剩下的那个人即为最后留下的人。
假设当前圈子的大小为size,第i个人的编号为i,则可以用一个数组来模拟这个过程,具体的代码如下:
```python
n, m = map(int, input().split())
people = [i for i in range(1, n+1)]
i = 0
while len(people) > 1:
i = (i + m - 1) % len(people)
people.pop(i)
print(people[0])
```
其中,people是一个列表,表示当前圈子中的人,i表示当前报数的人的下标,每次通过取模运算计算出下一个出圈的人的下标。最后剩下的那个人即为最后留下的人的编号。
相关问题
n个人围成一圈,按1到n的顺序编号,从第一个人开始报数(从1到m报数),凡报到m的人退出圈子,问最后留下的是原来的第几号
这是经典的约瑟夫问题(Josephus problem),可以用递归或数学公式求解。假设最后留下的人的编号为f(n,m),则有以下递推公式:
f(1,m) = 0 (只剩一个人,编号为0)
f(n,m) = (f(n-1,m) + m) % n (剩下n个人,第一次报数后,剩下n-1个人,编号重新从0开始)
根据递推公式,可以写出以下 Python 代码来求解:
```python
def josephus(n, m):
if n == 1:
return 0
else:
return (josephus(n-1, m) + m) % n
n = 10 # 总人数
m = 3 # 报数到m的人出圈
print(josephus(n, m)) # 输出最后留下的人的编号
```
对于 n=10, m=3 的情况,输出为 4,即原来的第4号留下来了。
c语言有n个人围成一圈用指针,C语言 有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子...
好的,这是经典的约瑟夫问题,其解法可以用循环链表和递归两种方式实现。以下是用循环链表实现的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* create(int n) {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node* tail = head;
for (int i = 2; i <= n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = i;
node->next = NULL;
tail->next = node;
tail = node;
}
tail->next = head; // 将链表的尾节点指向头节点,形成循环链表
return head;
}
Node* remove(Node* head, int k) {
Node* p = head;
while (p->next != p) { // 当链表中只剩一个节点时结束循环
for (int i = 1; i < k; i++) {
p = p->next;
}
Node* temp = p->next;
p->next = temp->next; // 将当前节点的下一个节点从链表中删除
free(temp); // 释放被删除节点的内存
}
return p;
}
int main() {
int n = 10;
int k = 3;
Node* head = create(n);
Node* p = remove(head, k);
printf("The last one is %d\n", p->data);
free(p); // 释放最后一个节点的内存
return 0;
}
```
这段代码中,`create`函数用于创建一个有`n`个节点的循环链表,并返回头节点的指针。`remove`函数用于从循环链表中每隔`k-1`个节点删除一个节点,直到链表中只剩下一个节点,最后返回最后一个节点的指针。在主函数中,我们调用`create`函数创建了一个有`10`个节点的循环链表,然后调用`remove`函数从链表中每隔`2`个节点删除一个节点,最后输出剩下的最后一个节点的编号。
阅读全文