13个人围成一圈,从第一个人开始顺序报号1,2,3。凡是报到3都退出圈子,找出最后留在圈子中的人原来的序号代码分析
时间: 2023-11-23 15:27:52 浏览: 82
这是一个经典的约瑟夫问题,可以使用递归或循环的方式来解决。以下是使用 Python 语言递归方式的代码实现:
```python
def last_person(n, m):
if n == 1:
return 0
else:
return (last_person(n - 1, m) + m) % n
n = 13 # 总人数
m = 3 # 报数到 m 退出
result = last_person(n, m)
print("最后留在圈子中的人原来的序号为:", result+1)
```
解释一下代码:`last_person(n, m)` 函数的作用是求解在 n 个人围成一圈时,每报到第 m 个人就退出圈子,最后留在圈子中的人原来的序号。当 n=1 时,只有一个人,他就是最后留在圈子中的人,因此返回 0。当 n>1 时,假设前 n-1 个人围成的圈子中最后留下的人的序号为 x,则在 n 个人围成的圈子中最后留下的人的序号为 `(x+m)%n`。例如,当 n=4,m=3 时,前三个人依次退出圈子,圈子中剩下的人依次为 4,1,2,因此最后留下的人原来的序号为 2。
相关问题
13个人围成一圈,从第一个人开始顺序报号1、2、3,凡是报到“3”的人退出圈子,找出最后留在圈子里的人原来的序号,用c语言的指针方法来写
这是经典的约瑟夫问题,可以使用链表或者数组模拟,这里演示使用数组的方法。
```c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 13; // 总人数
int m = 3; // 报到3的人出圈
int i, j, k;
int *a = (int *)malloc(n * sizeof(int)); // 动态分配数组空间
for (i = 0; i < n; i++)
{
a[i] = i + 1; // 初始化数组
}
i = 0; // i 表示当前报数的人在数组中的下标
j = 0; // j 表示已经出圈的人数
while (j < n - 1)
{
k = 0;
while (k < m)
{
if (a[i] != 0) // 如果这个人还在圈子里
{
k++;
}
if (k == m) // 如果报到3了
{
printf("%d 出圈\n", a[i]);
a[i] = 0; // 标记为已出圈
j++;
}
i++;
if (i == n) // 如果已经报完一圈了,从头开始
{
i = 0;
}
}
}
for (i = 0; i < n; i++) // 找出最后留在圈子里的人
{
if (a[i] != 0)
{
printf("最后留在圈子里的人是原来的第 %d 个人\n", a[i]);
break;
}
}
free(a); // 释放数组空间
return 0;
}
```
13个人围成一圈,从第一个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用链表实现。
这道题可以用循环链表来实现。具体步骤如下:
1. 创建一个循环链表,其中每个节点表示一个人,节点的数据域存储该人的序号。
2. 从第一个人开始,依次报数,每报到3就将该节点从链表中删除。
3. 直到只剩下一个节点时,该节点即为最后留在圈子中的人,其序号即为原来的序号。
代码实现如下:
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
class CircularLinkedList:
def __init__(self):
self.head = None
def add_node(self, data):
new_node = Node(data)
if not self.head:
self.head = new_node
new_node.next = self.head
else:
current = self.head
while current.next != self.head:
current = current.next
current.next = new_node
new_node.next = self.head
def remove_node(self, node):
if not self.head:
return
if self.head == node:
current = self.head
while current.next != self.head:
current = current.next
current.next = self.head.next
self.head = self.head.next
else:
current = self.head
while current.next != self.head:
if current.next == node:
current.next = current.next.next
break
current = current.next
def get_last_node(self):
current = self.head
while current.next != current:
for i in range(2):
current = current.next
self.remove_node(current)
return current
if __name__ == '__main__':
n = 13
linked_list = CircularLinkedList()
for i in range(1, n+1):
linked_list.add_node(i)
last_node = linked_list.get_last_node()
print(last_node.data)
```
运行结果为:
```
11
```
说明最后留在圈子中的人原来的序号为11。
阅读全文