C語言經典演算法100例-069-簡單約瑟夫環問題
阿新 • • 發佈:2019-01-28
這裡我們實現一個簡單的約瑟夫環問題,描述如下:
有N個人站成一圈,從第一個人開始報數,從1報到3,報到3的那個人走出圈,然後從下一個人開始從1繼續報數,重複上面的過程,直到最後圈裡只剩下一個人,問這個人是哪個人?
分析:首先,我們要給這N個人編號,分別編為1到N,
然後,開始報數,同時記錄 當前編號,所報數,圈內人數,
只要圈內人數大於1,就一直重複,
報數過程中,如果所報數為3,那麼要做這幾件事:1,將這個人踢出圈 2,圈內人數減一 3,重置所報數。
具體實現起來如程式碼所示:
這裡用陣列表示約瑟夫環,陣列內元素置0表示不在環內,當位置累積到N時置0來實現“環”結構。//n 個人,報數,去3,剩下幾號-簡單約瑟夫環問題 #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 20 int main() { int Ring[MAX_SIZE]; int i, n; int cnt; //代表報的數 int pos; //當前位置數 int num; //當前環中的人數 int *p = Ring; //用指標訪問陣列 //輸入環中的初始人數 printf("input the n.\n"); scanf("%d", &n); //輸入一些元素 for (i = 0; i < n; i++) *(p+i) = i+1; //報數 去3 num = n; pos = 0; cnt = 0; while (num != 1) //一直報到剩下一個人 { if(*(p + pos) != 0) ++cnt; //對當前元素報數 if (cnt == 3) //報到3了 { *(p + pos) = 0; //踢出環 --num; //環大小-1 cnt = 0; //重置報的數 } ++pos; //指向下一個元素 if(pos == n) //到環尾則返回環頭 pos = 0; } while (*p == 0) p++; //找到最後剩下的那個元素 printf("%d is left",*p); return 0; }