解题思路:
此题我们可以假设第一个的牌的位置,经过几次能回到原来的位置就可以啦!!即1回家时任一数字都回了家。
定理1:当第一张牌(牌1)回到初始位置时,所有的牌都回到了初始位置。
证明:设有一次操作,某牌在操作前处于位置r(1<=r<=2*N),那么,操作后,如果r原来是前一半的,显然r‘=r*2; 否则,r‘=(r-n)*2-1,即r‘=‘r*2-(N*2+1);
定理2:一定存在某次操作M,这次操作后,所有的牌都回到了初始位置。
代码:
#include<iostream>
using namespace
std;
int main()
{
int
N,i=1,M;//i表示指定数的位置,假设判断第一个数
while(cin>>N)
{
M=1;
while(1)
{
if(i<=N)
i*=2;//若该数小于等于N,则变换一次位置变为2*N
else
i=2*(i-N)-1;
if(i==1)break;
M++;
}
cout<<M<<endl;
}
return
0;
}
原文:http://www.cnblogs.com/hwh1239139516/p/3555730.html