poj2244 约瑟夫环
这个题目说给出n个数,第一个数必须出列,然后计算编号从2-n开始,使得2最后一个出列的最小的m值,其实也就是n-1约瑟夫环,从1-n-1
s=1;
for(i=2;i<=n-1;i++)
s=(s+m)%i;
if(s==1)
m为所求,我们让m从1开始。。
源码如下:
#include <iostream>
#include <stdio.h>
using namespace std;
const int MAX=150;
int main()
{
int i,s,n,m,rs[MAX];
for(n=3;n<MAX;n++)
{
m=1;
while(1)
{
s=1;
for(i=2;i<=n-1;i++)
{
s=(s+m)%i;
if(s==0)
s=i;
}
if(s==1)
{
rs[n]=m;
break;
}
else
m++;
}
}
while(1)
{
scanf("%d",&n);
if(!n)
break;
printf("%d\n",rs[n]);
}
//递归方法求约瑟夫环,下标从1-n编号
// int s=1,i,n,m;
// n=4;
// m=3;
// for(i=2;i<=n;i++)
// {
// s=(s+m)%i;
// if(s == 0)
// s=i;
// }
// cout<<s<<endl;
return 0;
}