题目描述 n个人排成一圈,按顺时针方向依次编号1,2,3…n。从编号为1的人开始顺时针"一二"报数,报到2的人退出圈子。这样不断循环下去,圈子里的人将不断减少。最终一定会剩下一个人。试问最后剩下的人的编号。 要求程序模拟题意来实现。 输入 不超过1000组数据。 每组数据一行,每行一个正整数,代表人数n。 (1 <= n <= 1000) 输出 每组输入数据输出一行, 仅包含一个整数,代表最后剩下的人的编号。
时间: 2024-03-14 16:43:39 浏览: 18
好的,这道题是经典的约瑟夫环问题。可以采用循环链表的方式来模拟这个过程。以下是一份C++的代码实现,供您参考:
```c++
#include <iostream>
using namespace std;
struct Node {
int num; // 节点编号
Node* next; // 指向下一个节点的指针
};
int main() {
int n;
while (cin >> n) {
Node* head = new Node{1, nullptr}; // 头节点
Node* cur = head;
for (int i = 2; i <= n; i++) {
Node* node = new Node{i, nullptr};
cur->next = node;
cur = node;
}
cur->next = head; // 将尾节点指向头节点,形成环
Node* prev = cur; // 上一个节点
cur = head; // 当前节点
while (cur->next != cur) { // 直到只剩一个节点
prev->next = cur->next; // 上一个节点的next指针指向下一个节点
Node* tmp = cur; // 保存当前节点
cur = cur->next->next; // 跳过一个节点,将当前节点移动到下下个节点
delete tmp; // 释放当前节点的内存
prev = prev->next; // 更新上一个节点的位置
}
cout << cur->num << endl; // 最后剩下的节点编号
delete cur; // 释放内存
}
return 0;
}
```
每一轮循环,我们都将当前节点移动到下下个节点,然后删除当前节点。最终只剩下一个节点时,输出该节点的编号即可。注意要释放申请的内存,避免出现内存泄漏。
阅读全文