1.约瑟夫问题
描述:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入:输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。
输出:输出包含一行,即最后猴王的编号。
样例输入
12 4
样例输出
1
#include<stdio.h>
#include<stdlib.h> //存放malloc,calloc,realloc,free函数
using namespace std;
typedef int ElemType;
typedef struct DNode //结点类型
{
int data; //数据域
struct DNode *next; //指针域
}DNode; //DNode为结构体类型的变量名。
int main()
{
DNode *L,*r,*s,*p;
int i,n,k;
scanf("%d%d",&n,&k);
L = (DNode *)malloc(sizeof(DNode));
r = L;
for(i = 1; i <= n; i++) //尾插法建立链表,插入数据
{
s = (DNode *)malloc(sizeof(DNode));
s->data = i;
r->next = s;
r = s;
}
p = L->next;
s->next = p; //连接首尾元素,使链表成环。
free(L); // 释放头结点
while(p->next != p)
{
for(i = 1; i< k-1; i++)
{
p = p->next;
}
p->next = p->next->next; //将第k只猴子淘汰
p = p->next;
}
printf("%d\n",p->data);
return 0;
}