• 魔术师发牌问题


    一、问题描述

    魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下)。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止。问原来牌的顺序是如何的?

    二、程序代码

    #include<stdio.h>
    #include<stdlib.h>
    #define CardNumber 13
    typedef struct node
    {    
        int data;
        struct node *next;
    }sqlist,*linklist;
    
    
    linklist CreateLinkList()
    {    
        linklist head=NULL;
        linklist s,r;
        int i;
        r=head;
    
        for(i=1;i<=CardNumber;i++)
        {    
            s=(linklist)malloc(sizeof(sqlist));
            s->data=0;
            if(head==NULL)
                head=s;
            else
                r->next=s;
            r=s;
        }
        r->next=head;
        return head;
    }
    
    
    
    
    
    //销毁工作
    void DestoryList(linklist* list)
    {    
        linklist ptr=*list;
        linklist buff[CardNumber];
    
        int i=0;
        while(i<CardNumber)
        {    
            buff[i++]=ptr;
            ptr=ptr->next;
        }
        for(i=0;i<CardNumber;i++)
        {    
            free(buff[i]);
        }
        *list=0;
    }
    
    
    void Magician(linklist head)
    {
        linklist p;
        int j;
        int Countnumber=2;
        p=head;
        p->data=1;
        while(1)
        {    
            for(j=0;j<Countnumber;j++)
            {    
                p=p->next;
                if(p->data!=0)
                {    
                    p->next;
                    j--;
                }
            }
           if(p->data == 0)
            {
                p->data = Countnumber;
                Countnumber++;
                if (Countnumber == 14)
                {
                    break;
                }
    
            }
    
        }
    }
    
    
    int main()
    {    
        linklist p;
        int i;
    
        p=CreateLinkList();
        Magician(p);
    
        printf("按如下顺序排列:
    ");
        for(i=0;i<CardNumber;i++)
        {
            printf("黑桃%d",p->data);
            p=p->next;
        }
        printf("
    ");
        DestoryList(&p);
        return 0;
    }
    View Code

    三、程序运行结果

  • 相关阅读:
    考勤助手——基于CS三层结构的子系统设计
    淘宝网架构分析——反向代理
    软件架构风格——解释器风格详析
    软件架构风格
    考勤助手类图的设计
    任课教师管理考勤子系统之用例图
    考勤助手ER图2.0版本所存在的问题
    关于“考勤助手”体系架构风格的选取
    浅谈CDN技术的性能与优势
    软件体系结构——解释器风格的浅解
  • 原文地址:https://www.cnblogs.com/wutao666/p/9688283.html
Copyright © 2020-2023  润新知