約瑟夫環問題

2021-04-13 02:04:59 字數 1934 閱讀 6323

約瑟夫環問題

[問題描述]

編號是1,2,……,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼(正整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。設計乙個程式來求出出列順序。

[基本要求]

利用單向迴圈鍊錶儲存結構模擬此過程,按照出列的順序輸出各個人的編號。此題所用的迴圈鍊錶中不需要「頭結點」,請注意空表和非空表的界限。

[測試資料]

m的初值為20,n=7 ,7個人的密碼依次為3,1,7,2,4,7,4,首先m=則正確的輸出是什麼?

要求:

輸入資料:首先輸入待處理人員數及他們的密碼,然後輸入m的初值,建立單迴圈鍊錶。

輸出形式:建立乙個輸出函式,將正確的出列序列輸出。

方法一:

#include

#define len sizeof(struct josnode)

struct josnode

;void joseph(int *m,struct josnode *p);

struct josnode *creat(int n);

struct josnode *move(struct josnode *head);

void main()

while(passwd<=0||n<=0);

joseph(&passwd,move(creat(n)));

}struct josnode *creat(int n)

while(p1->pwd<=0);

i++;

p1->ord=i;

if(i==1) head=p1;

else p2->next=p1;

p2=p1;

p1=(struct josnode *)malloc(len);

}p2->next=head;

return (head);

}struct josnode *move(struct josnode *head)

void joseph(int *m,struct josnode *head)

printf("%d/n",head->ord);

}方法二:

遞迴不過有點問題,各位高手幫忙改寫一下~

#include

#define len sizeof(struct josnode)

struct josnode

;void joseph(int *m,struct josnode *p);

struct josnode *creat(int n);

struct josnode *move(struct josnode *head);

void main()

struct josnode *creat(int n)

p2->next=head;

return (head);

}struct josnode *move(struct josnode *head)

void joseph(int *m,struct josnode *p)

printf("%d/n",p->ord);

}/*遞迴實現*/

/*void joseph(int password,struct josnode *head)

printf("/t%d",h->ord);

head=h->next;

if(p!=null)

else

if(head->next==head)

printf("/t%d",head->ord);

free(h);

if(head->next!=head&&head->next!=null)

joseph(k,head);}*/

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...

約瑟夫環問題

一設計任務書 課題名 約瑟夫環問題 問題描述 題的一種描述是 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數.報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人...