簡單陣列實現約瑟夫環演算法
阿新 • • 發佈:2019-02-19
問題描述:已知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)
後續優化待續。。。