约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

python实现:

# 单链表节点
class LinkNode:
def __init__( self, value ):
self.value = value
self.next = None # 创建循环单链表,值从1开始
def create_cycle( total ):
head = LinkNode( 1 )
prev = head
index = 2
while total - 1 > 0:
curr = LinkNode( index )
prev.next = curr
prev = curr
index += 1
total -= 1
curr.next = head
return head # 模拟约瑟夫环过程,从1开始计数
def run( total, m ):
assert total >= 0, 'total should lq 0'
assert m >= 0, 'm should lt 0'
node = create_cycle( total )
prev = None
start = 1
index = start
while node and node.next:
if index == m:
print( 'pop:' + node.value )
prev.next = node.next
node.next = None
node = prev.next
       index = start
else:
prev = node
node = node.next
index += 1 run( 5, 2 )

c++实现如下:

#include <stdio.h>
#include <stdlib.h> #define COUNT_INIT 1 // 计数起点 typedef struct LINKNODE
{
int value;
struct LINKNODE* next;
}LinkNode, *LinkNodePtr; // 创建结点
LinkNodePtr createNode( int value )
{
LinkNodePtr node = ( LinkNodePtr )malloc( sizeof( LinkNode ) );
node->value = value;
return node;
} // 创建循环单链表
LinkNodePtr createCycle( int total )
{
int index = 1;
LinkNodePtr head = NULL, curr = NULL, prev = NULL;
head = createNode( index );
prev = head; while( --total > 0 )
{
curr = createNode( ++index );
prev->next = curr;
prev = curr;
}
curr->next = head; // 链表尾结点指向头结点, 构成循环链表
return head;
} // 数到m, 节点出列, 下一个节点继续从1开始数. m不可与COUNT_INIT同值
void run( int total, int m )
{
LinkNodePtr node = createCycle( total );
LinkNodePtr prev = NULL;
int index = COUNT_INIT; while( node && node->next )
{
if( index == m )
{
printf( "pop:%d\n", node->value );
prev->next = node->next;
node->next = NULL;
free( node );
node = prev->next;
index = COUNT_INIT;
}
else
{
prev = node;
node = node->next;
index++;
}
}
}

  

约瑟夫环问题及python与c++实现效率对比的更多相关文章

  1. Python多进程与单进程效率对比

    运行环境:Python3 in win10 先生成200个测试文件 # generate.py i = 0 while i < 200: o = open("test\\" ...

  2. 简洁之美 -约瑟夫环的python 解法

    问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...

  3. Python练习——约瑟夫环问题、用类方法描述一个数字时钟

    一.约瑟夫环问题 有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他 ...

  4. C#实现约瑟夫环问题

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace orde ...

  5. C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

    尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...

  6. C语言链表实现约瑟夫环问题

    需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...

  7. javascript中使用循环链表实现约瑟夫环问题

    1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...

  8. tc 147 2 PeopleCircle(再见约瑟夫环)

    SRM 147 2 600PeopleCircle Problem Statement There are numMales males and numFemales females arranged ...

  9. HDU 3089 (快速约瑟夫环)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3089 题目大意:一共n人.从1号开始,每k个人T掉.问最后的人.n超大. 解题思路: 除去超大的n之 ...

随机推荐

  1. 《学习OpenCV》练习题第四章第三题a

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" #pragma comment ...

  2. 第一百九十五天 how can I 坚持

    晚上回来又肚子疼,拉肚子,咋搞的呢. 小米.华为.感觉虽然现在华为有些许优势,哎,还是不说了,感觉小米手机信号好像有问题. 中午吃的刀削面好像不熟,其实,怎么说呢,像开面馆,做的面顾客都吃不完,很明显 ...

  3. css斜线

    斜线 .demo{ display: inline-block; width: 400px; height: 100px; resize: both; overflow: auto; margin-t ...

  4. python知识点(07-08)

    python: 循环else: while true: if x>1: print() break else: print() 文件循环: for line in open(‘test.txt’ ...

  5. ThinkPHP C+F方式

    ThinkPHP常用C+F方法进行配置设置于缓存设置 比如常见的 C(F('smtp'),'smtp');表示获取F方法中smtp缓存,设置配置为smtp函数 C方法是ThinkPHP用于设置.获取, ...

  6. hdu-4753-Fishhead’s Little Game-记忆化搜索

    网赛的一道题目,当时没做出来. 由题意可知,最多只有12条边未知. 所以最多只有(1<<12)种状态. 所以记忆化搜索这种状态下,枚举添加任意一条边之后的状态的最优值. #include& ...

  7. Add mappings to an Elasticsearch index in realtime

    Changing mapping on existing index is not an easy task. You may find the reason and possible solutio ...

  8. 观察者模式:关于通知的使用(NSNotificationCenter)

    一.通知的使用方法 1.发出通知 例如:[[NSNotificationCenter defaultCenter]postNotificationName:@"backToFirstPage ...

  9. 开源文件比较工具:WinMerge、KDiff3、diffuse

    为了寻找免费的BeyondCompare的替代品,最后经过实用,找到如下一些: 1.diffuse 感受:如果仅仅是比较两个文本类的文件,这个软件也就够用了. 安装好后,对着文件点击右键,会出现“Op ...

  10. java_web用户的自动登录模块的实现

    javaBean的代码 package bean; import java.io.Serializable; public class Admin implements Serializable{ / ...