約瑟夫問題C語言實現
題目內容:有n只猴子,按順時針方向圍成一圈選大王(編號從1到n),從第1號開始報數,一直數到m,數到m的猴子退出圈外,剩下的猴子再接着從1開始報數。就這樣,直到圈內只剩下一隻猴子時,這個猴子就是猴王,編程求輸入n,m後,輸出最後猴王的編號。
輸入格式:輸入包含兩個整數,第一個是n,第二個是m (0 < m,n <=300)。
輸出格式:輸出包含一行,即最後猴王的編號。
輸入樣例:18 2
輸出樣例:5
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Lnode//定義循環鏈表結點
{
unsigned int id;
struct Lnode *next;
}Lnode,*LinkList;
void CreateCList(LinkList l,int n);//建立鏈長爲n的循環鏈表
void Delete(LinkList l,int n,int m);//刪去數到m的元素
void CreateCList(LinkList l,int n)//l爲頭結點,不存儲數據,僅方便遍歷
{
LinkList p;
l->next=l;
int i;
for (i=n;i>=1;i--)
{
p=(LinkList)malloc(sizeof(Lnode));
p->id=i;
p->next=l->next;
l->next=p;
}
}
void Delete(LinkList l,int n,int m)
{
int t=1,i=0;
LinkList p,pre;
pre=l;
p=pre->next;
while(i<n-1)
{
if (p==l)//若p指向頭結點,不做任何操作,直接跳過
{
pre=p;
p=p->next;
}
if(m==t)//數到m,刪除此結點
{
i++;
pre->next=p->next;
p=pre->next;
t=1;
}
else
{
pre=p;
p=p->next;
t++;
}
}
}
void Disp(LinkList l)//輸出猴王結點
{
LinkList p;
p=l->next;
while(p!=l)
{
printf("%d",p->id);
p=p->next;
}
}
int main(int argc, char *argv[]) {
int m,n;
scanf("%d %d",&n,&m);
LinkList l;
l=(LinkList)malloc(sizeof(Lnode));
CreateCList(l,n);
Delete(l,n,m);
Disp(l);
return 0;
}