jjccx

jjccx's blog
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一个N年前的奥赛题

Posted on 2004-11-26 13:38  jjccx  阅读(584)  评论(0编辑  收藏  举报

题目描述:

  一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后再放回原处。再取3枚,取4枚  直至m枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中的每一枚又都是正面朝上为止。例如,m为1时,翻两次即可。m为2时,翻3次即可;m为3时,翻9次即可;m为4时,翻11次即可;m为5时,翻24次即可; ;m为30时,翻899次即可; 

  输 入:
  仅有的一个数字是这摞硬币的枚数m,0<m<1000。

  输 出:
  为了使这摞硬币中的每一枚又都是正面朝上所必需翻的次数。

  输入样例:
      30
  输出样例:
      899

解:

//n:n coins

long GetTurnTime(int n)

{

     if(n == 1)

         return 2;

 

     int d = 2 * n + 1;

     int t = 2;

     int i = 1;

 

     do

     {

         if(t == 1)

              return i * n;

 

         if(t == 2 * n)

              return i * n - 1;

 

         t = (2 * t) % d;

     }while(i++);

}

 

int _tmain(int argc, _TCHAR* argv[])

{

     using namespace std;

 

     int n;

     while(1)

     {

         cout << "Enter the poker's sum:";

         cin >> n;

         cout << "Your must turn " << GetTurnTime(n) << " times." << endl;

     }

     return 0;

}