删数

有一个数组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;
}
原文地址:https://www.cnblogs.com/yuguangyuan/p/5841832.html