用C++Vector和Queue解决循环报数淘汰问题

来源:互联网 发布:云计算认证考试费用 编辑:程序博客网 时间:2024/06/08 11:14

问题:

100人围成一个圈,每人有一个编码,编码从1到100。他们开始从1开始依次报数,报到M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人小于M。输出剩下的人原先的号码,M=3时为:58,91,M=4时为34,45,97.

分析:将首位放进Vector的末尾,然后删除首位,当达到报数那一位的时候直接删除首位,不再放进末尾。queue的编程思路相同。

代码1,vector:

void vector_way(){vector<int>a;vector<int>::iterator iter = a.begin();for (int i = 0; i < 100; i++)a.push_back(i + 1);int m;while (1){cin >> m;int j = m;while (a.size()>= m){j = m;while (j - 1){a.push_back(a[0]);a.erase(a.begin());j--;}a.erase(a.begin());}for (int i = 0; i < m - 1; i++)cout << a[i] << endl;;}}
代码2,queue:

void queue_way(){queue<int>q;int n;int m;while (1){cin >> m;int j = m;for (int i = 1; i <= 100; i++)q.push(i);while (q.size() >= m){j = m;while (j - 1){q.push(q.front());q.pop();j--;}q.pop();}for (int i = 0; i < m - 1; i++){cout << q.front() << endl;q.pop();}system("PAUSE");}}