编写"怪异的洗牌"时洗牌只能洗一次了
问题描述:当我输入的洗牌次数达到2次及以上时,运行结果会错误(原本应该输出数字的位置变成了0,且洗牌次数越多,0所替换的数字越多)
(我猜想是不是洗牌循环的过程出错了)
题目:假设有两种洗牌方式:
第一种方法是从某个位置分成两半,然后相交换,称之为移位(shift)。比如原来的次序是123456,从第4个位置交换,结果就是561234。
第二种是把后一半(如果总数是奇数,就是(n-1)/2)牌翻转过来,这种操作称之为翻转(flip)。比如1234567进行一次flip,结果就是1234765。
先进行一次shift再进行一次flip为一次完整的洗牌,给定n张牌,初始次序为从1到n,经过若干次的shift和flip操作后,结果会是什么样?请编写程序实现洗牌的过程
以下是我编写的程序:
程序代码:
#include <stdio.h> void main() { int i,x=0,n,m,q,p,k,g,h; int y; int a[1001]={0},b[1001]={0}; printf("pai de ge shu we n="); scanf("%d",&n); y=n/2; printf("shift fa sheng de wei zhi m="); scanf("%d",&m); p=m-1; q=-1; printf("xi pai ci shu wei k="); scanf("%d",&k); for(i=0;i<n;i++) a[i]=++x; for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); for(i=0;i<k;i++) { for(g=0;g<n-m;g++) b[g]=a[++p]; for(g=n-m;g<n;g++) b[g]=a[++q]; for(h=0;h<n;h++) { if(h<=(n-y-1)) a[h]=b[h]; else a[h]=b[2*n-y-1-h]; } } for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); }
[此贴子已经被作者于2020-12-16 20:41编辑过]