约瑟夫问题

题目描述

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

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

请输出最后一个人的编号。

输入

输入n和m值。

输出

输出胜利者的编号。

示例输入

5 3

示例输出

4

提示

第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
数组解
View Code
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a[100],i,m,n,next,num,rest;
 5     scanf("%d%d",&n,&m);
 6     for(i=1;i<=n;i++)
 7         a[i]=1;
 8     rest=n;
 9     num=1;
10     next=1;
11     while(rest>1)
12     {
13         if(a[num]==1)
14             if(next==m)
15             {
16                 a[num]=0;
17                 rest--;
18                 next=1;
19             }
20             else
21                 next++;
22             if(num==n)
23                 num=1;
24             else
25                 num++;
26     }
27     i=1;
28     while((i<=n)&&(a[i]!=1))
29         i++;
30     printf("%d\n",i);
31     return 0 ;
32 }

链表解

 

View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 struct node
 4 {
 5     int num ;
 6     struct node *next ;
 7 } ;
 8 struct node *creat(int n)
 9 {
10     int i ;
11     struct node *head, *p, *tail ;
12     p = (struct node*)malloc(sizeof(struct node)) ;
13     p -> num = 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(struct node)) ;
20         p -> num = i ;
21         tail->next = p ;
22         tail = p ;
23         tail->next = NULL ;
24 
25     }
26     tail->next = head ;
27     return head ;
28 }
29 int del(struct node *head, int m, int n)
30 {
31     int count = 0, i = 0 ;
32     struct node *p, *q ;
33     q = head ;
34     while(q->next!=head)
35     {
36         q = q -> next ;
37     }
38     while(count<n-1)
39     {
40         p = q ->next ;
41         i++ ;
42         if(i%m==0)
43         {
44             q->next = p->next ;
45             free(p) ;
46             count++ ;
47         }
48         else
49         q = p ;
50     }
51     return q->num ;
52 }
53 int main()
54 {
55     int n, m, c ;
56     struct node *head ;
57     scanf("%d %d", &n, &m) ;
58     head = creat(n) ;
59     c = del(head, m, n) ;
60     printf("%d\n", c) ;
61     return 0 ;
62 
63 }

 

 

 

posted @ 2013-01-23 21:22  yelan@yelan  阅读(303)  评论(0编辑  收藏  举报