约瑟夫环问题

解法一
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n,*p,num[51],i,k;
cout<<"input number of person:n=";
cin>>n;
p=num;
for(i=0;i<n;i++)
{
*(p+i)=i+1;
}
k=0;
m=0;
i=0;
while(m<n-1)
{
if(*(p+i)!=0)
{
k++;
}
if(k==3)
{
*(p+i)=0;
m++;
k=0;
}
i++;
if(i==n)
i=0;
}
while(*p==0)
p++;
cout<<"The last one is NO."<<*p<<endl;
return 0;
}
解法二
#include<bits/stdc++.h>
using namespace std;
int sum,num;
int ysf(int n,int m);
int main()
{
cin>>sum>>num;
int ans=ysf(sum,num);
cout<<ans+1;
}
int ysf(int n,int m)
{
if(n==1)
{
return 0;
}
else {
return (ysf(n-1,m)+m)%n;
}
}
解法三
#include<bits/stdc++.h>
#include<list>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
list<int> a;
for(int i=0;i<n;i++)
{
a.push_back(i);
}
list<int>::iterator cur=a.begin();
list<int>::iterator next;
while(a.size()>1)
{
for(int i=1;i<m;i++)
{
cur++;
if(a.end()==cur)
{
cur=a.begin();
}
}
next=++cur;
if(next==a.end())
{
next=a.begin();
}
a.erase(--cur);
cur=next;
}
cout<<(*cur)+1;
}