有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的值。
输入:每行一个整数N
输出:输出与之对应的M
输入样例:
20
1
输出样例:
20
2
#include <stdio.h>
int main(){
int pos,count,n;
while(scanf("%d",&n)!=EOF){ //遇Ctrl+Z结束
count=0;
pos=1;
while(1){
if(pos<=n)pos=2*pos;
else pos=(pos-n)*2-1;
count++;
if(pos==1){
printf("%d\n",count);
break;
}
}
}return 0;
}
如若要展示出洗牌过程,则:
#include <stdio.h>
int main(){
int n,pos,count,i;
int a[101],b[101];
while(scanf("%d",&n)!=EOF){
for(i=1;i<=2*n;i++){
a[i]=i;
printf("%d ",a[i]); //输出查看数组中元素是否正确,可没有
}printf("\n");
count=0;
while(1){
for(pos=1;pos<=2*n;pos++){
if(pos<=n)
b[pos*2]=a[pos];
else b[(pos-n)*2-1]=a[pos];
}for(pos=1;pos<=2*n;pos++){
a[pos]=b[pos];
printf("%d ",a[pos]); //输出洗牌过程
}printf("\n");
count++;
if(a[1]==1)
break;
}printf("%d\n",count);
}return 0;
}