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