3
约瑟夫问题(10分)
题目内容:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入格式:输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。
输出格式:输出包含一行,即最后猴王的编号。
输入样例:18 2
输出样例:5
时间限制:500ms内存限制:32000kb
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int Data;
struct Node* Next;
};
typedef struct Node *List;
int main()
{
List L;
L = (Node*)(malloc(sizeof(Node)));
Node *p, *q, *temp;
int n, m;
scanf_s("%d %d", &n, &m);
L->Data = 1;
q = L;
for (int i = 2; i <= n; i++)
{
p = (Node*)(malloc(sizeof(Node)));
p->Data = i;
q->Next = p;
q = p;
}
q->Next = L;
p = L;
while (p->Next != p)
{
for (int i = 1; i < m; i++)
{
p = p->Next;
}
temp = p->Next;
p->Next = temp->Next;
free(temp);
}
printf("%d\n", p->Data-1);
}