题目描述:
一摞硬币共有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;
}