约瑟夫环问题

来源:互联网 发布:centos 桥接模式 设置 编辑:程序博客网 时间:2024/06/08 15:25

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。

以上出自必应网典,最通常的写法是用链表,在网上看到有人用数组,我认为代码冗余过长,下面给出自己的解法,欢迎大家批评和指正。

    #include<stdio.h>    #define  MAX  100    int main(int argc,char *argv[])    {        int p_num;        int c_num;        printf("请输入总人数:\n");        scanf("%d",&p_num);        printf("请输入数到第几个数就出局:\n");        scanf("%d",&c_num);        int a[MAX] = {0};        int i;        for(i = 0;i < p_num;i++)    //初始化编号        {            a[i] = i + 1;        }        i = p_num;        int j = -1;        int k;        while(i--)          //每次淘汰一人        {            for(k = 0;k < c_num;k++)        //如果报数到3就出局,循环三次找到不等于-1的数            {                j++;                                                             while(a[j % p_num] == -1)                    j++;            }            if(i == 0)             //最后只剩下一个数            {                printf("\n最后一个人号码为:%d\n",a[j % p_num]);                break;            }            printf("%4d",a[j % p_num]);            a[j % p_num] = -1;              //要淘汰的标记位为-1        }        return 0;    }

运行实例

0 0
原创粉丝点击