假设我们有 2n 张牌,它们以 1, 2, ..., n, n+1, ..., 2n 编号并在开始时保持着这种顺序。一次洗牌就是将牌原来的次序变为 n+1, 1, n+2, 2, ..., 2n, n,也就是将原来的前 n 张牌放到位置 2, 4, ..., 2n,并且将余下的 n 张牌按照他们原来的次序放到奇数位置 1, 3, ..., 2n-1。已经证明对于任何一个自然数 n,这 2n 张牌经过一定次数的洗牌就回到原来的次序。但我们不知道对于一个特定的 n,需要几次洗牌才能将牌洗回原来的次序。
输入:
牌张数的一半n,即初始情况下一共有2n张牌,n为int型整数
输出:
将牌洗回原来的次序所需要的洗牌次数
思路较为简单,如果第一位数字(也就是1)经过若干次交换回到了1的位置,就表示所有的牌都回到了原位,这样我们就可以直接计算第一位数字(也就数1)多少次可以回到原来的位置来表示要洗牌的次数。
前n位的计算规则是:i*2;
n+1位到2*n位的计算规则是:(i-n)*2-1;(这里的i就表示n+1到2*n之间的数字)
如果第一位数字经过若干次计算后==1,就表示回到原位,跳出循环(这里的count少加了1),count+1就是次数。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
int count = 0;
for (int i = 1; i <= 2*n; count++)
{
if (i < n + 1)
{
i *= 2;
}
else//如果大于n+1,就按照另一种计算方式
{
i=(i - n)*2-1;
}
if (i == 1)
{
break;
}
}
printf("%d\n", ++count);
return 0;
}