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

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

点赞