洗牌问题(找规律)

Eddy's 洗牌问题

点我

Problem Description
Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n。这也是最初的牌的顺序。通过一次洗牌可以把牌的序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n。那么可以证明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到初始的顺序。编程对于小于100000的自然数N,求出M的值。
 
Input
每行一个整数N
 
Output
输出与之对应的M
 
Sample Input
20
1
 
Sample Output
20
2
找规律吧 拿N+1来找,经过多少次后能回到原来的位置。比如N=4时,5->1->2->4->8->7->5,所以是6次。
 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 int main()
 5 {
 6     int N;
 7     while(cin>>N)
 8     {
 9         int    n=1;
10         int i=1;
11         while(n!=(N+1))
12         {
13             if(n<=N)
14             {
15                 n=n*2;
16                 i++;
17             }
18             else
19             {
20                 n=(n-N)*2-1;
21                 i++;
22             }
23         }
24         cout<<i<<endl;
25     }
26 }
原文地址:https://www.cnblogs.com/a1225234/p/4591255.html