题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
求出在这个圆圈中剩下的最后一个数字。
方法一:采用list容器链表存放元素,但是要维护头尾节点的循环。
#include <iostream>
#include <list>
using namespace std;
int LastElement(const int m,int length)
{
list<int> integers;
int index;
for(int i = 0; i < length; i++)
{
integers.push_back(i);
}
list<int>::iterator iter = integers.begin();
while(length > 1)
{
index = 1;
while(index < m)
{
++iter;
if(integers.end() == iter)
{
iter = integers.begin();
}
index++;
}
list<int>::iterator nextiter = ++iter;
if(nextiter == integers.end())
nextiter = integers.begin();
--iter;
cout << *iter << endl;
integers.erase(iter);
iter = nextiter;
length--;
}
return *iter;
}
int main()
{
LastElement(3,10);
return 0;
}
方法二:采用循环链表,不需要维护头尾节点循环,但是要创建链表。有兴趣读者自己完成