简单数组实现约瑟夫环算法

来源:互联网 发布:熊猫软件公司反毒软件 编辑:程序博客网 时间:2024/04/28 06:37

问题描述:已知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)
后续优化待续。。。

0 0
原创粉丝点击