约瑟夫问题

Problem Description
n个人想玩残酷的死亡游戏,游戏规则如下: 

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

请输出最后一个人的编号。
Input
输入n和m值。
Output
输出胜利者的编号。
Example Input
5 3
Example Output
4

01 #include<stdio.h>
02 #include<stdlib.h>
03 struct node
04 {
05     int date;
06     struct node *next;
07 } *head, *tail, *p, *q;
08 int main()
09 {
10     int n, m, i, c = 0, d = 0;
11     scanf("%d%d", &n, &m);
12     p = (struct node *)malloc(sizeof(struct node));
13     p -> date = 1;
14     p -> next = NULL;
15     head = p;
16     tail = p;
17     for(i = 2; i <= n; i++)
18     {
19         p = (struct node *)malloc(sizeof(structnode));
20         p -> date = i;
21         tail -> next = p;
22         tail = p;
23         p -> next = NULL;
24     }
25     tail -> next = head;
26     p = head;
27     while(p -> next != head)
28     {
29         p = p -> next;
30     }
31     while(c < n - 1)
32     {
33         q = p -> next;
34         d++;
35         if(d % m == 0)
36         {
37             p -> next = q -> next;
38             free(q);
39             c++;
40         }
41         else
42         {
43             p = q;
44         }
45     }
46     printf("%d", p -> date);
47     return 0;
48 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值