首页 > 代码库 > 黑马程序员--c语言练习:亚瑟夫环

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

<style type="text/css" isprelink="true">@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);</style><style type="text/css">@import url(/css/cuteeditor.css);</style><style type="text/css" isprelink="true">@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);</style><style type="text/css">@import url(/css/cuteeditor.css);</style>

发一下之前用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\n",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\n",q->number);                 //输出剩下的那个人

    

    

}

int main()

{

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

    

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

    scanf("%d",&n);

    

    if(n<2)

    {

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

        return 0;

    }

    

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

    scanf("%d",&m);

    

    if(n<2)

    {

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

        return 0;

    }

    

    def(n,m);

    

    return 0;

}


 

 

 

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