约瑟夫问题I
- 热度指数:6310 时间限制:3秒 空间限制:32768K
约瑟夫问题是一个非常著名的趣题,即由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。
给定两个int n和m,代表游戏的人数。请返回最后一个出局的人的编号。保证n和m小于等于1000。
测试样例:
5 3
返回:4
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int n, m;
typedef struct list{
int num;
struct list* next;
} joseph;
joseph *p1, *p2, *head;
cin >> n >> m;
for (int i = 0; i < n; i++) {
p1 = (joseph*)malloc(sizeof(joseph));
p1->num = i + 1;
if (i == 0) head = p1;
else p2->next = p1;
p2 = p1;
}
p2->next = head;
joseph *pos = head;
joseph *s = pos;
while (n>1)
{
for (int i = 0; i < m-2; i++)
pos = pos->next;
s = pos->next;
pos->next = s->next;
pos = pos->next;
n--;
}
cout<<pos->num;
return 0;
}