2:约瑟夫问题

来源:互联网 发布:阿里云百度云差距 编辑:程序博客网 时间:2024/06/10 17:54
总时间限制: 
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;}


0 0