![]() |
#2
do8do8do82020-12-16 21:05
|



问题描述:当我输入的洗牌次数达到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");
}
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编辑过]