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;
}

posted on 2011-09-05 15:05  buptLizer  阅读(491)  评论(0编辑  收藏  举报

导航