首先这个题目通过手动模拟,以及思考容易知道,当一张牌回到了原来的位置,那么整副牌也就回到了原来的顺序。因为这种洗牌的规则是整体的运动,不是局部的循环,整体上的循环也就使得每一张牌的地位都是一样的。因此只要观察一张牌的运动就可以了。
代码如下:
#include <stdio.h>
#include <math.h>
int main(){
int n;
//这个题目的洗牌是很有规律的,整体上都是在动的
//容易想到当一张牌回到原来的位置时
//整副牌就是回到原来的位置了。
//那我们就看第一张牌的位置变化就可以了哦
while(scanf("%d",&n)!=EOF && n){
int sta=2; //第一次转移后的位置
int step=1; //洗牌的次数
while(sta!=1){
if(sta<=n) sta*=2;
else sta=(sta-n)*2-1;
step++;
}
printf("%d\n",step);
}
return 0;
}
好啦,加油哦,我们明天再见!