有一个数组a[N]顺序存放0-N,要求没隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为 例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删 除)->6->7->0(删除),如此循环直到最后一个数被删除。
像这种不能使用下标做计算,因为下标是随时都会变化的。使用指针去做,这样就能避开这个问题。STL迭代恰好解决了这个问题
#include<iostream> #include<list> using namespace std; int main() { int M = 2; int N; while (cin >> N) { list<int> lst; for (int i = 0; i<N; i++) { lst.push_back(i); } list<int>::iterator iter = lst.begin(); while (lst.size()>1) { if (iter == lst.end()) iter = lst.begin(); for (int i = 0; i<M; i++) { iter++; if (iter == lst.end()) iter = lst.begin(); } iter = lst.erase(iter); } cout << lst.front() << endl; } return 0; }