約瑟夫問題,「遍歷」思想 C語言實現

2021-08-11 15:18:38 字數 1342 閱讀 4195

題目:

乙個旅行社要從n個遊客中選出一名遊客,為他提供免費旅行服務,選擇方法是讓n個遊客圍成乙個圓圈,然後從信封中取出一張紙條,用上面寫著的正整數m作為報數值,第乙個人從1開始乙個人乙個人按順時針報數,報到第m個遊客時,令其出列。然後再從下乙個人開始,從1順時針報數,報到第m個遊客,再令其出列……,直到圓圈中只剩乙個人為止。此人即為優勝者,將獲免費旅行服務,例如n=8,m=3,出列的順序將為3、6、1、5、2、8、4,最初編號為7的遊客將獲免費旅遊服務。

——《c語言程式設計實驗與課程設計教程》清華出版社,遊洪躍、彭駿、譚斌主編,案例6約瑟夫問題

我想先將**寫出來:

#include

#include

int joseph(int, int);//宣告joseph函式

int main(void)

int joseph(int n, int m)

if (j == n - 1) break;//當j==n-1時,只有一位遊客值為1,可以跳出死迴圈了

if (i == n) i = 0;//重新「遍歷」(檢查)一次陣列

if (*(array + i) == 1) count++;//檢查遊客,若值為1,count++,若值為),count不變

}for (i = 0; i < n; i++)//找出array[i]==1時的i的值

}//釋放儲存記憶體

free(array);

//返回獲勝者編號

return (i + 1);

}

之所以寫了「遍歷」,一是應為我的思路就是不斷的從array[0]檢查到array[n-1],不斷的count++,j++;賦值為0代表著遊客出列,直到只有乙個遊客值為0,找出他的編號再輸出,解決方案;二是,「」,遍歷好像經常用在二叉樹上_(:з」∠)。

詳解:(文筆練習中……)

我們從陣列的第一位元素檢查到最後一位,每當檢查的遊客值為1時,使count++,這樣,每當count==報值數m時,就說明我們需要將此時array[i]賦值為0,但我們要等到下一次迭代中才能將其賦值為0,而下一次迭代是的i值增加了1,所以,在**中我們有array[i-1]=0;代表著有乙個遊客出列,並且在該遊客出列時,我們要重置count的值,同時也要j++;

將出列遊客賦值為0的目的是,當我們每次重新從第一位元素檢查到最後一位時,對值為0的遊客不計數,實現了用c語言描述出遊客出列後的程式執行問題;

j++用來計數我們已經有多少個遊客出列了,按題目要求,當出列人數為n-1時,我們中止迴圈;

然後通過檢查陣列中僅剩的值為1的編號,並返回該值,最後在main()函式中使用joseph函式,解決約瑟夫問題。

結束語:

約瑟夫問題 C語言實現

約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0 n 1,最後 1 結果...

約瑟夫環問題的C語言實現

約瑟夫環問題是迴圈中的乙個經典問題,它有多個版本,我們這次選擇最常見的,即被點到出局不再計入迴圈型。n個人圍成一圈,編號從1 n,第乙個人從1數起,數到7的那個人就被淘汰出局,接下來的人又從1數起,數到7再次被淘汰 如果人數不滿7個,則迴圈著數 最後剩下的乙個人就是贏家 主函式已經給出 includ...

C語言 實現約瑟夫環

鏈式解法 include include typedef struct sqlist sqlist 建立解約瑟夫環需要的鍊錶,該鍊錶不帶頭節點 sqlist creatlist int length p next null 普通鍊錶轉不帶頭結點的迴圈鍊錶,就是將頭指標下移到第乙個節點位置 原來的頭結...