約瑟夫環問題
[問題描述]
編號是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值,從他在順時針方向上的下乙個人...