H:洗牌(选作)

假设我们有 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值