• 黑马程序员--c语言练习:亚瑟夫环


    发一下之前用c语言做的亚瑟夫环,希望多多指教,共同学习 


    用标记的方式:

    #include <stdio.h>


    int count = 1;                        //用于循环:判定当前的人所报的数是否为3的倍数


    int main()

    {

        

        int i, j = 15;                //i 用于数据循环  //j 记录人数


        int a[15];

        

        for(i = 0; i <j ; i++)          // 为每个人赋值  1   目的是判定出去的人  a[i] = 0

            a[i] = 1;

        // 循环方式为i  0~15  环形循环,结束条件j==1,即只剩一人


        for(i = 0; j > 1 ;i ++)

        {

            if(i>14)                        // i大于数据界限,从零重新开始

                i -= 15;

            

            if(a[i])                        //  a[i]!=0 ,a[i]继续参与判定

            {

                if(count % 3 == 0)        // 若报数为3的倍数

                {

                    a[i] =0;        //使他下一轮不参与判定

                    j--;                //判定人数-1

                }

                count++;                        //报数+1

                

            }

        }


        //只有叛徒的a[i]值任然为1,若在数组中的位置i,则他的真实位置是i+1

        

        for(i = 0; i < 15; i++)

            if(a[i])

                printf("叛徒是%d ",i+1);


        return 0;

        

    } 

    用链表链接形成环 

    #include <stdio.h>

    #include<malloc.h>


    #define LEN sizeof(struct Defect)        // 计算结构体大小

    struct Defect                            // 定义叛徒结构体

    {

        int number;                          // 为每个人自己的号码牌

        struct Defect *next;                 // 指针,下面用它链接形成环体

    };

    void def(int n,int m)                    // 传入人数n和报数为m时退出

    {

        int i = 2,count = 2;                 // i 记录人数,count记录报数

        

        struct Defect *head,*p,*q;                // 设置三个结构体指针

        

        q = head= (struct Defect *)malloc(LEN);   // 为第一个人申请结构体

        head->number = 1;                         // 定义第一个结构体的号码为1

        

        while(i<=n)                               // 用循环申请n个人的结构体,并为每个人的号码赋值

        {

            p = (struct Defect *)malloc(LEN);     // 申请

            p->number = i++;                      //赋值

            q->next = p;                          //链接

            q = p;                                //定位

        }

        

        i = n;                                    //记录当前人数

        p->next = head;                           //最后的人和第一个人链接

        q = head;                                 //指定开始位置,由于设定为一个换   需要的话可以设定任意位置为开始位置

        

        while(i>1)                                //人数大于1执行循环

        {        p = q->next;                     //p指向下一个人

            if(count%m == 0)                      //如果报数为m的倍数

            {

                q->next = p->next;                //删除当前的结构体

                p->next = 0;

                i--;                              //人数减一

            }

            else

                q = p;                            //不满足条件,移动判定人

            count++;                              //报数加1

            if(count>3)                           //报数大于三时,换为其实可以没有这个判定,为了题目设计的123,123,123~~

                count = 1;

        }

        

        printf("%d ",q->number);                 //输出剩下的那个人

        

        

    }

    int main()

    {

        int n,m;                                  //设置人数,和报数退出条件

        

        printf("请输入总人数: ");

        scanf("%d",&n);

        

        if(n<2)

        {

            printf("游戏无意义!!");

            return 0;

        }

        

        printf("请输入退出者的报数: 提示:若为1,则失去游戏的意义 ");

        scanf("%d",&m);

        

        if(n<2)

        {

            printf("游戏无意义!!");

            return 0;

        }

        

        def(n,m);

        

        return 0;

    }


  • 相关阅读:
    css 学习笔记 菜鸟
    html学习 菜鸟
    flask 杂记2
    logging 为全局的日志工具对象添加日志记录器
    flask 框架 转载:https://cloud.tencent.com/developer/article/1465968
    flask 框架 转载:https://cloud.tencent.com/developer/article/1465949
    flask blueprint
    [ZJOI2005]午餐
    [ZJOI2006]皇帝的烦恼
    数位dp小练
  • 原文地址:https://www.cnblogs.com/frozen1224/p/4245153.html
Copyright © 2020-2023  润新知