約瑟夫問題

2021-08-14 08:34:05 字數 1148 閱讀 2203

一、問題描述:約瑟夫問題

乙個旅行社要從n個旅客中選出一名旅客,為他提供免費的環球旅行服務。旅行社安排這些旅客圍成乙個圓圈,從帽子中取出一張紙條,用上面寫的正整數m(二、任務要求

(1)用單迴圈鍊錶解決約瑟夫問題。

(2)用順序表解決約瑟夫問題。

以上二選一

三、測試資料

輸入說明,輸入的第一行表示總的旅客數,輸入的第二行表示報數值,輸入的第三行表示報數人的起始編號。

輸入樣例:

輸出說明,輸出這n個人的淘汰順序

輸出樣例:

1. 分析問題:

(1)假設有9名旅客,編號為1,2,……,9。從編號為1的這個人開始從1報數,當報到5時的那個人淘汰,接著接下來的那個人開始又從1開始報數,直到最後只剩乙個人。

(2)順序表的儲存結構

#define n 100//順序表可能達到的最大長度

typedef structlist;

2. 完整**:

#include

#include

#define n 100//巨集定義,順序表可能達到的最大長度

typedef structlist;//結構體型別為list

int printlist(list *l)//構建乙個順序表l

int i,m,n,s,j;

scanf("%d%d%d",&n,&m,&s);

for(i=0;il->data[i]=i+1;//將旅客進行編號

i=s-1;

printf("輸出%d個人的淘汰順序:\n");

while(n>1)

i=(i+m-1)%n;//通過模運算算出將要淘汰的下標

printf("%d\n",l->data[i]);//輸出淘汰的編號

for(j=i+1;jl->data[j-1] = l->data[j];//將後乙個數放在淘汰的數對應的位置

n--;

if(i==n)

i=0;

printf("%d\n",l->data[i]);//輸出最後乙個淘汰的編號

int main()

list l;//初始化順序表l

printlist(&l);//呼叫函式

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫問題

這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...