一共有n个人,围成一圈,从1开始报数,数到m的人出局,然后重新开始报数。算出出局的人的顺序。 要求:用顺序和链式存储两种方法完成
时间: 2023-05-16 13:04:24 浏览: 195
对于这个问题,我可以给出两种解法:
1. 顺序存储解法:
首先,我们可以用一个数组来存储这n个人,然后用一个变量i来表示当前报数的人的下标,初始值为0。接着,我们可以用一个循环来模拟整个出局的过程,每次循环中,我们都让i加上m-1,表示数到m的人出局,然后将出局的人标记为-1。当i超过数组的长度时,我们需要将i减去数组的长度,以实现循环报数的效果。最后,我们可以用另一个循环来输出出局的人的顺序。
代码如下:
int n, m;
cin >> n >> m;
int* a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = i + 1;
}
int count = n;
int i = 0;
while (count > 0) {
i = (i + m - 1) % n;
if (a[i] != -1) {
cout << a[i] << " ";
a[i] = -1;
count--;
}
i++;
}
delete[] a;
2. 链式存储解法:
我们可以用一个循环链表来存储这n个人,每个节点表示一个人,节点中包含该人的编号和指向下一个节点的指针。初始时,我们可以用一个循环来创建这个链表。接着,我们可以用一个指针p来表示当前报数的人所在的节点,初始值为链表的头节点。接着,我们可以用一个循环来模拟整个出局的过程,每次循环中,我们都让p指向第m个节点,表示数到m的人出局,然后将出局的节点从链表中删除。当p指向的节点是链表的尾节点时,我们需要将p指向链表的头节点,以实现循环报数的效果。最后,我们可以用另一个循环来输出出局的人的顺序。
代码如下:
struct Node {
int val;
Node* next;
Node(int x) : val(x), next(NULL) {}
};
int n, m;
cin >> n >> m;
Node* head = new Node(1);
Node* p = head;
for (int i = 2; i <= n; i++) {
p->next = new Node(i);
p = p->next;
}
p->next = head;
int count = n;
while (count > 0) {
for (int i = 1; i < m - 1; i++) {
p = p->next;
}
cout << p->next->val << " ";
Node* temp = p->next;
p->next = p->next->next;
delete temp;
count--;
p = p->next;
}
delete head;
阅读全文