约瑟夫环

用链表实现约瑟夫环的求解
约瑟夫环
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

typedef struct node{
int num;
int pwd;
node *next;
}lnode, *joseph;

int main(){
joseph s = (joseph)malloc(sizeof(lnode)), p = (joseph)malloc(sizeof(lnode));
int n, i = 0, m;
scanf_s("%d %d", &n, &m);
scanf_s("%d", &p->pwd);
p->num = 1;
p->next = NULL;
s = p;
s->next = p;
p->next = s;
for (i = 1; i < n; i++){
p->next = (joseph)malloc(sizeof(node));
scanf_s("%d", &p->next->pwd);
p->next->num = i + 1;
p = p->next;
p->next = s;
}
for (i = 0; i < n - 1; i++){
s = s->next;
}
i = 1;
while (n > 1){
p = (joseph)malloc(sizeof(lnode));
if (i%m == 0){
m = s->next->pwd;
printf("%d ", s->next->num);
p = s->next;
s->next = p->next;
free(p);
n--;
i = 1;
}
else{
i++;
s = s->next;
}
}
printf("%d ", s->num);
free(s);
printf("\n");
system("pause");
return 0;
}

文章目录
,