时空限制
CPU占用时长: 1秒 内存使用限制: 128MB
问题描述
有编号从 1 到 N 的 N 个人坐成一圈报数,报到 M 的人出局,下一位再从1开始,如此持续,直止剩下一位为止,报告此人的编号 X。输入 N,M,求出 X。
输入格式
第一行:两个整数N,M (0< N,M < 30,000) ,表示开始人数N和报数到M。
输出格式
一个整数X,表示剩下的最后一个数。
输入输出样例
样例1
输入样例
5 2
输出样例
3
参考代码
#include <iostream>
using namespace std;
struct Node {
int value;
Node* next;
Node(int val) : value(val), next(nullptr) {}
};
int josephus(int n, int m) {
Node* head = new Node(1);
Node* prev = head;
for (int i = 2; i <= n; ++i) {
Node* newNode = new Node(i);
prev->next = newNode;
prev = newNode;
}
prev->next = head; // 循环链表
Node* curr = head;
while (curr->next != curr) {
int count = 1;
while (count != m-1) {
curr = curr->next;
++count;
}
Node* temp = curr->next;
curr->next = temp->next;
delete temp;
curr = curr->next;
}
int lastPerson = curr->value;
delete curr;
return lastPerson;
}
int main() {
int n,m; // 人数n,报到m的人出列
cin>>n>>m;
int lastPerson = josephus(n, m);
cout << lastPerson << endl;
return 0;
}