題目:
乙個旅行社要從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 普通鍊錶轉不帶頭結點的迴圈鍊錶,就是將頭指標下移到第乙個節點位置 原來的頭結...