Description
给你2N张牌,编号依次为1~2n。这也是最初的牌的顺序。
每一次洗牌首先将所有牌分成上下两堆,每堆n张牌,然后将两堆牌依次交叉重合在一起。
比如第一次洗牌时,前面一堆的n张牌的编号依次为1~n,后面一堆的n张牌的编号依次为n+1~2n,后面一堆牌的第一章在最上面,将2堆牌交叉重合后的序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n。
可以证明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到初始的顺序。
编程对于小于10000的自然数N,求出M的值。
Input
一个自然数N(不超过10000)。
Output
一个整数,即洗牌次数M。
Sample Input 1
20
Sample Output 1
20
当我们写出几组数据之后就不难发现规律了:
- 若n=3
1 2 3 4 5 6
4 1 5 2 6 3
2 4 6 1 3 5
1 2 3 4 5 6
以中间为分界线,如果数字的位数小于n,那么位数乘以二,如果数字的位数大于n,那么位数应该等于2*(t-n)-1,就相当于第一份牌全部站偶数位,第二份牌全部站奇数位。并且只需要验证一个数字即可,比如1。
#include <stdio.h>
int main()
{
int n,t=1,count=0;
scanf("%d", &n);
while (1)
{
if (t <= n)//如果数字在n前面,那么位数翻倍
t *= 2;
else if (t > n)//如果数字在n的后面,那么位数变成2 * (t - n) - 1
t = 2 * (t - n) - 1;
count++;
if (t == 1)
break;
}
printf("%d", count);
return 0;
}