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

问题描述:当我输入的洗牌次数达到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
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:10 
may be
int a[1001]={0},b[1001]={0};

input n < 1001

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2020-12-16 21:05
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
题目看不懂,贴完整了吗,怎么没说输入什么输出什么?
代码太难看,变量既多又乱,还全定义到头部去了,看一行代码就要找半天变量在哪儿。

程序代码:
#include <stdio.h>

// 题目中提到的shift和flip,都需要用到反转算法,故而将其独立出来
void reverse( unsigned cards[], size_t length )
{
    for( size_t i=0,j=length; i+1<j; ++i )
    {
        unsigned t = cards[i];
        cards[i] = cards[--j];
        cards[j] = t;
    }
}

// 从某个位置分成两半,然后相交换
void shift( unsigned cards[], size_t length, size_t pos )
{
    reverse( cards, pos );
    reverse( cards+pos, length-pos );
    reverse( cards, length );
}

// 把后一半(如果总数是奇数,就是(n-1)/2)牌翻转过来
void flip( unsigned cards[], size_t length )
{
    reverse( cards+(length+1)/2, length/2 );
}

// 先进行一次shift再进行一次flip为一次完整的洗牌
void shuffle( unsigned cards[], size_t length, size_t pos )
{
    shift( cards, length, pos );
    flip( cards, length );
}

// 输出所有牌面
void show( unsigned index, const unsigned cards[], size_t length )
{
    printf( "第%u次翻牌后的结果为: ", index );
    for( size_t i=0; i!=length; ++i )
        printf( "%u%c", cards[i], " \n"[i+1==length] );
}

int main( void )
{
    enum {
        n = 9,   // 牌的数目
        m = 7,    // 切牌位置
        count = 5 // 洗牌次数
    };
    
    unsigned cards[n];
    for( unsigned i=0; i!=n; ++i )
        cards[i] = i+1;
    
    for( unsigned i=0; i!=count; ++i )
    {
        show( i, cards, n );
        shuffle( cards, n, m );
    }    
}


输出是
第0次翻牌后的结果为: 1 2 3 4 5 6 7 8 9
第1次翻牌后的结果为: 8 9 1 2 3 7 6 5 4
第2次翻牌后的结果为: 5 4 8 9 1 6 7 3 2
第3次翻牌后的结果为: 3 2 5 4 8 7 6 1 9
第4次翻牌后的结果为: 1 9 3 2 5 6 7 8 4
2020-12-16 22:00
快速回复:编写"怪异的洗牌"时洗牌只能洗一次了
数据加载中...
 
   



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

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