约瑟夫环问题(Josephus)

转载 2006年06月20日 23:23:00

 

原题:

 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus)

提示:

    由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍然是围成一个圆圈的,可以使用循环表,由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁的情况,选用效率较高的链表结构,为了程序指针每一次都指向一个具体的代表一个人的结点而不需要判断,链表不带头结点。所以,对于所有人围成的圆圈所对应的数据结构采用一个不带头结点的循环链表来描述。设头指针为p,并根据具体情况移动。
    为了记录退出的人的先后顺序,采用一个顺序表进行存储。程序结束后再输出依次退出的人的编号顺序。由于只记录各个结点的number值就可以,所以定义一个整型一维数组。如:int  quit[n];n为一个根据实际问题定义的一个足够大的整数。

代码:

/********************************************************************
    created:    2006/06/14
    filename:   C:/Documents and Settings/Administrator/桌面/tmpp/josephus.c
    file path:  C:/Documents and Settings/Administrator/桌面/tmpp
    file base:  josephus
    file ext:   c
    author:     A.TNG
    version:    0.0.1
   
    purpose:    实现 Josephus 环问题
                用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,
                直至全部输出。写出C程序。(约瑟夫环问题 Josephus)
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

/* 结构体和函数声明 */
typedef struct _node_t
{
    int             n_num;
    struct _node_t *next;
} node_t;

node_t         *node_t_create(int n);
node_t         *node_t_get(node_t **pn, int m);

/* 功能函数实现 */

/*
 *  name: node_t_create
 *  params:
 *    n         [in]        输入要构造的链表的个数
 *  return:
 *    返回构造成功的环形单向链表指针
 *  notes:
 *    构造节点数量为 n 的环形单向链表
 *
 *  author: A.TNG 2006/06/14 17:56
 */
node_t * node_t_create(int n)
{
    node_t *p_ret   = NULL;

    if (0 != n)
    {
        int     n_idx   = 1;
        node_t *p_node  = NULL;

        /* 构造 n 个 node_t */
        p_node = (node_t *) malloc(n * sizeof(node_t));
        if (NULL == p_node)
            return NULL;
        else
            memset(p_node, 0, n * sizeof(node_t));

        /* 内存空间申请成功 */
        p_ret = p_node;
        for (; n_idx < n; n_idx++)
        {
            p_node->n_num = n_idx;
            p_node->next = p_node + 1;
            p_node = p_node->next;
        }
        p_node->n_num = n;
        p_node->next = p_ret;
    }

    return p_ret;
}

/*
 *  name: main
 *  params:
 *    none
 *  return:
 *    int
 *  notes:
 *    main function
 *
 *  author: A.TNG 2006/06/14 18:11
 */
int main()
{
    int     n, m;
    node_t *p_list, *p_iter;

    n = 20; m = 6;

    /* 构造环形单向链表 */
    p_list = node_t_create(n);

    /* Josephus 循环取数 */
    p_iter = p_list;
    m %= n;
    while (p_iter != p_iter->next)
    {
        int i   = 1;

        /* 取到第 m-1 个节点 */
        for (; i < m - 1; i++)
        {
            p_iter = p_iter->next;
        }

        /* 输出第 m 个节点的值 */
        printf("%d/n", p_iter->next->n_num);

        /* 从链表中删除第 m 个节点 */
        p_iter->next = p_iter->next->next;
        p_iter = p_iter->next;
    }
    printf("%d/n", p_iter->n_num);

    /* 释放申请的空间 */
    free(p_list);

    system("PAUSE");
}

 

《C++语言基础》实践参考——Josephus(约瑟夫环)问题

返回:贺老师课程教学链接  项目要求【项目-Josephus(约瑟夫环)问题】n个小孩子围成一圈,从第一个小孩子开始顺时针方向数数字,到第m个小孩子离开,这样反反复复,最终只剩下一个小孩子,求第几个小...
  • sxhelijian
  • sxhelijian
  • 2015年05月26日 19:06
  • 4241

约瑟夫环问题python解法

约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人被杀掉;他的下一个人又从1开始报数,数到k的那个人又被杀掉;依此规律重复下去,直到...
  • littlethunder
  • littlethunder
  • 2014年09月10日 16:28
  • 7250

Josephus约瑟夫环问题STL模版类vector实现

问题描述: 已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号1开始报数,数到k的那个人出列;他的下一个人又从1开始报数,数到k的那个人又出列;依此规律重复下去,直到圆桌周...
  • u014644805
  • u014644805
  • 2015年04月28日 10:16
  • 746

约瑟夫环问题(josephus problem)详解

约瑟夫环问题描述:   编号为1,2,3...n的人一词围成一圈,从第k个人开始报数(从1开始),数到m的人退出。接着下一个人又从1开始报数,数到m的人退出,以此类推。问:剩下的人的编号是多少?   ...
  • sun_star1chen
  • sun_star1chen
  • 2013年12月26日 23:11
  • 3410

约瑟夫环问题 java代码实现(高效率)

问题来历编辑 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决...
  • uniquewonderq
  • uniquewonderq
  • 2015年06月13日 19:27
  • 1368

C++面向对象方法求解约瑟夫环问题

约瑟夫问题有很多种解法及其变种,这里的约瑟夫环问题是这样的: [b]约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数...
  • u010155023
  • u010155023
  • 2015年02月14日 12:39
  • 1081

约瑟夫环的数组实现 __ 经典思考题原创解法.

题目:  约瑟夫(Josephus)问题是由古罗马的史学家约瑟夫提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他...
  • FIRE_Vayen
  • FIRE_Vayen
  • 2015年02月13日 10:47
  • 1456

10行Python代码解决约瑟夫环(模拟)

写这篇文章是因为看到别人博客里用了很长一个篇幅(超过50行)去解决一个约瑟夫环问题,而且还是用以简洁著称的python,另外,如果你用X度搜索python 约瑟夫,看到得前几条都是错的,真是好悲剧。 ...
  • u011044759
  • u011044759
  • 2014年09月11日 17:21
  • 30628

Java实现约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;...
  • qq_21150865
  • qq_21150865
  • 2017年03月05日 14:48
  • 4515

PHP篇之二个函数解决约瑟夫环问题

讲故事了! 约瑟夫环问题起源于一个犹太故事。:   罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友。剩余的39个人为...
  • backOrigin
  • backOrigin
  • 2016年12月17日 23:14
  • 999
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:约瑟夫环问题(Josephus)
举报原因:
原因补充:

(最多只允许输入30个字)