2:约瑟夫问题
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
- 输入
- 输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。
- 输出
- 输出包含一行,即最后猴王的编号。
- 样例输入
-
12 4
- 样例输出
-
1
-
-
源代码
-
-
#include <stdio.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode *next; }LNode; LNode* CreateLinkList(int n) { LNode* L = NULL; LNode* p = NULL; LNode* q = NULL; int i; L = (LNode *)malloc(sizeof(LNode)); L->next = NULL; p = L->next; q = L; for (i = 1; i <= n; i++) { p = (LNode *)malloc(sizeof(LNode)); p->next = NULL; p->data = i; q->next = p; q = q->next; } q->next = L->next; return L; } LNode * ysf(LNode *L, int m, int n) { LNode* p = NULL; LNode* q = NULL; int i; p = q = L->next; if (1 != m) { while (p != p->next) { for (i = 1; i != m; i++) { if (2 == m) { q = q->next; } else { p = q; q = q->next; } } p->next = q->next; free(q); p = p->next; q = p; } } else { while ((--n)>0) { p = p->next; free(q); q = p; } L->next = p; } return p; } int main(void) { LNode* L = NULL; LNode* p = NULL; int m, n; scanf("%d%d", &n, &m); L = CreateLinkList(n); p = ysf(L, m, n); printf("%d", p->data); return 0; }
转载本Blog文章请注明出处,否则,本作者保留追究其法律责任的权利。
本人转载别人或者copy别人的博客内容的部分,会尽量附上原文出处,仅供学习交流之用,如有侵权,联系立删。