約瑟夫問題C語言實現

約瑟夫問題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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章