/*问题描述:n个人(编号0~(n-1)),从0开始报数,报到m-1的退出,剩下的人继续从0开始报数。求胜利者的编号。*/
#include <stdio.h>
int main(void)
{
int n, m, i, s=0;
printf ("N M = ");
scanf("%d%d", &n, &m);
for (i=2; i<=n; i++)
s=(s+m)%i;
printf ("The winner is %d\n", s);
return 0 ;
}
1 #include<stdio.h>
2 #include<stdlib.h>
3 struct stu
4 {
5 int num;
6 struct stu *next;
7 };
8 /*int shuzu(int n,int m)
9 {
10 int a[302];
11 int i,t,p;
12 for(i=0;i<=n;i++)//数组初始化为1
13 a[i]=1;
14 t=n;
15 i=1;
16 p=1;
17 while(t>1)//当数组中还有超过一个未出圈就继续循环
18 {
19 if(a[i]==1)//判断是否出圈
20 {
21 if(p==m)//判断是否到达m个,是则初始化,否则计数加加
22 {
23 a[i]=0;
24 p=1;
25 t--;
26 }
27 else
28 p++;
29 }
30 i++;
31 if(i>n) i=1;//判断是否超过数组长度,是则从头开始
32 }
33 for(i=1;i<=n;i++)//寻找最后一个未出圈的谁
34 if(a[i]==1)
35 printf("%d\n",i);
36 return 0;
37 }*/
38
39 int main()
40 {
41 int i,n,m;
42 struct stu *p,*q,*head;//链表专用
43 while(scanf("%d%d",&n,&m),n||m)
44 {
45 // shuzu(n,m);//数组计数
46
47
48 //链表计数
49 head=(struct stu*)malloc(sizeof(struct stu));
50 head->num=1;
51 head->next=head;
52 p=head;
53 if(m==1) printf("%d\n",n);
54 else
55 {
56 for(i=2;i<=n;i++)//生成链表
57 {
58 q=(struct stu*)malloc(sizeof(struct stu));
59 q->num =i;
60 p->next =q;
61 p=p->next ;
62 p->next=head;
63 }
64 //q=head;
65 while(head!=head->next)//开始循环
66 {
67 for(i=2;i<m;i++)
68 head=head->next ;
69 head->next =head->next->next;
70 head=head->next;
71 }
72 printf("%d\n",head->num);
73 free(head);
74 }
75 }
76 return 0;
77 }