1. 程式人生 > >簡單陣列實現約瑟夫環演算法

簡單陣列實現約瑟夫環演算法

問題描述:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從第一個人開始報數,數到m的那個人出桌;他的下一個人又從1開始報數,數到m的那個人又出桌;依此規律重複下去,直到圓桌周圍的人全部出桌。設計演算法求當給定任意n和m後,n個人的出桌次序。
演算法原理
1.n個人編號以1,2,3,…,n;
2.1開始報數,報到m出桌,輸出該數,下一個人又從1開始報數,報到m出桌;
3.迴圈第2步;
4.全部出桌演算法結束。
虛擬碼
1.對n個人編號,儲存在queue陣列下標1到n(便於描述);
2.重複迴圈m次,利用flag變數做queue陣列下標控制,每到m時,將queue[flag]置零,並輸出該數,相當於出桌,用count變數對出桌人數計數,;
3.flag數到n時,做flag=flag%n;
4.當count=n時,終止迴圈,演算法結束。
程式程式碼

#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
    int queue[100];
    int n, m;
    int flag = 1;
    int count = 0;
    cout << "please input the n:" << endl;
    cin >> n;
    cout << "please  input the m" << endl;
    cin >> m;
    queue
[0] = 0; for (int i = 1;i <= n;i++) queue[i] = i;//編號 for (int j = 1;j <= m;j++) { if (queue[flag] == 0) j--; //queue[flag]=0,表示出桌,j要保持不變,繼續驗證下一個 if (j == m) { if (tem == 0) cout << "出隊序列:" << endl; cout << queue[flag]; cout
<< " "; count++; queue[flag] = 0; //置零,出桌 j = 0; //重新報數 } if (flag >= n) flag = flag%n; if (count == n) { cout << endl; break; } flag++; } system("pause"); return 0; }

記:該演算法時間複雜度o(mn)
後續優化待續。。。