算法,约瑟夫环

1330阅读 0评论2014-11-09 bitpeng
分类:C/C++

题目描述:M个人围成一个圈,从第一个人开始报数1,报到N的人退出,下一个人继续从1开始报数,最后剩下的一个人的胜利者,求该胜利者。
分析:使用C++标准库bitset,每个人对应一位,然后开始报数,当报到N时将该位置为0.从下一位继续开始报数。
//M个人,报到N的退出。

点击(此处)折叠或打开

  1. //M个人,报到N的退出。
  2. void JosephRing(int M ,int N)
  3. {
  4.     assert(M > 0 && N > 0);
  5.     int i = 0;
  6.     int num = 0;//报数号。
  7.     std::bitset<M> bit;
  8.     bit.set(); //所有的人都在圈中,所有位都除初始化为1.
  9.     //当bit中只有一个人时退出。
  10.     for (;bit.count() > 1;++i)
  11.     {
  12.         //只有在圈中的人才报数。
  13.         if(bit.test(i % M))
  14.         {
  15.             ++num;
  16.             
  17.         }
  18.         if (num == N)
  19.         {
  20.             bit.reset(i);
  21.             num = 0;
  22.         }
  23.     }
  24. }


上一篇:linux命令解析getopt_long()
下一篇:算法:字符串翻转