方法1:list 循环
方法2: 公式法
方法3:链表
#include<iostream>
#include<list>
using namespace std;
//方法1
int LastRemaining(unsigned int n,int m)
{
if(n<1 || m<-1)
return 0;
list<int> numbers;
for(int i=0;i<n;i++)
numbers.push_back(i);
list<int>::iterator iter = numbers.begin();
while(numbers.size()>1)
{
for(int i=1;i<m;i++)
{
++iter;
if(iter==numbers.end())
iter=numbers.begin();
}
list<int>::iterator next = ++iter;
if(next==numbers.end())
next=numbers.begin();
numbers.erase(--iter);
iter = next;
}
return *iter;
}
//方法2
int LastRemaining2(unsigned int n,int m)
{
if(n<1 || m<-1)
return 0;
int result = 0;
for(int i=2;i<=n;i++)
result = (result+m)%i;
return result;
}
// ====================测试代码====================
void Test(char* testName, unsigned int n, unsigned int m, int expected)
{
if(testName != NULL)
printf("%s begins: \n", testName);
if(LastRemaining(n, m) == expected)
printf("Solution1 passed.\n");
else
printf("Solution1 failed.\n");
if(LastRemaining2(n, m) == expected)
printf("Solution2 passed.\n");
else
printf("Solution2 failed.\n");
printf("\n");
}
void Test1()
{
Test("Test1", 5, 3, 3);
}
void Test2()
{
Test("Test2", 5, 2, 2);
}
void Test3()
{
Test("Test3", 6, 7, 4);
}
void Test4()
{
Test("Test4", 6, 6, 3);
}
void Test5()
{
Test("Test5", 0, 0, -1);
}
void Test6()
{
Test("Test6", 4000, 997, 1027);
}
int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
return 0;
}
#include<iostream>
using namespace std;
struct ListNode
{
int data;
ListNode *next;
};
void Josephus(int n,int k,intm)
{
if(n<k || n<m)
return;
ListNode *head=new ListNode();
head->data=1;
head->next=NULL;
ListNode *p=head;
for(int i=2;i<=n;i++)
{
ListNode *node=new ListNode();
node->data=i;
p->next=node;
p=p->next;
}
p->next=head;
p=head;
ListNode *r=p;
while(k--)
{
r=p;
p=p->next;
}
while(n--)
{
for(int s=m-1;s--;r=p,p=p->next);
r->next=p->next;
cout<<p->data<<" ";
delete p;
p=r->next;
}
}
int main()
{
Josephus(13,4,2);
}