约瑟夫环问题

来源:互联网 发布:c语言复制字符串函数 编辑:程序博客网 时间:2024/05/20 00:12

约瑟夫环: 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;}
0 0