| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 882 人关注过本帖
标题:编写"怪异的洗牌"时洗牌只能洗一次了
取消只看楼主 加入收藏
lqhdsg123
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-12-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:0 
编写"怪异的洗牌"时洗牌只能洗一次了

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

搜索更多相关主题的帖子: i++ for 结果 printf 编写 
2020-12-16 20:30
快速回复:编写"怪异的洗牌"时洗牌只能洗一次了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032269 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved