您的位置:首页 > 其它

约瑟夫环问题

2016-04-08 19:36 295 查看
约瑟夫环: n个数字排成一个圆圈,从数字0开始,每次从这个圆圈中删除第k个数字,求这个圆圈中最后剩下的数字。

我们可以使用标准库中的链表来模拟一个圆环,每次访问到链表的结尾时,重新从头开始访问,直到链表中只剩下最后一个元素,输出结果。

int lastRemaining(unsigned int n,unsigned int k){

if (n < 1 || k < 1){

return -1;
}

list<int> numbers;
for (int i = 0; i < n;++i)
{
numbers.push_back(i);
}
list<int> ::iterator current = numbers.begin();
while (numbers.size()>1)
{
for (int i = 1; i < k;++i)
{
++current;
if (current==numbers.end())
{
current = numbers.begin();
}
}

list<int>::iterator i_next = ++current;
if (i_next==numbers.end())
{
i_next = numbers.begin();
}
--current;
numbers.erase(current);
current = i_next;

}

return *current;
}


更简便的一种实现:

int lastRemaining(unsigned int n,int k){
if(n<1||k<1){

return -1;
}
int result=0;
for(int i=2;i<=n;++i){

result=(result+k)%i;
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息