约瑟夫环问题及python与c++实现效率对比
约瑟夫环是一个数学的应用问题:已知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++实现效率对比的更多相关文章
- Python多进程与单进程效率对比
运行环境:Python3 in win10 先生成200个测试文件 # generate.py i = 0 while i < 200: o = open("test\\" ...
- 简洁之美 -约瑟夫环的python 解法
问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...
- Python练习——约瑟夫环问题、用类方法描述一个数字时钟
一.约瑟夫环问题 有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他 ...
- C#实现约瑟夫环问题
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace orde ...
- C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...
- C语言链表实现约瑟夫环问题
需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...
- javascript中使用循环链表实现约瑟夫环问题
1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...
- tc 147 2 PeopleCircle(再见约瑟夫环)
SRM 147 2 600PeopleCircle Problem Statement There are numMales males and numFemales females arranged ...
- HDU 3089 (快速约瑟夫环)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3089 题目大意:一共n人.从1号开始,每k个人T掉.问最后的人.n超大. 解题思路: 除去超大的n之 ...
随机推荐
- 让git忽略ignore所有文件,只对某些文件进行版本控制
*.c !frob_*.c !custom.c 或者:*!*/ # 这个的意思是不忽略目录.否则目录被忽略了之后,它里面的所有文件都忽略了!*.c!*.cc!*.cpp!*.cxx 也就是先忽略所有文 ...
- 转】MySQL客户端输出窗口显示中文乱码问题解决办法
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4008095.html 感谢! 最近发现,在MySQL的dos客户端输出窗口中查询表中的数据时,表中的中文数据都显 ...
- CXF整合Spring发布WebService实例
一.说明: 上一篇简单介绍了CXF以及如何使用CXF来发布一个简单的WebService服务,并且介绍了客户端的调用. 这一篇介绍如何使用CXF与spring在Web项目中来发布WebService服 ...
- STM32中的位带(bit-band)操作
转:http://blog.csdn.net/gaojinshan/article/details/11479929 //位带操作,实现51类似的GPIO控制功能 //具体实现思想,参考<< ...
- 下拉框QComboBox相关函数
QComboBox addItem (self, QString text, QVariant userData = QVariant())addItem (self, QIcon icon, QSt ...
- 在ASP.NET MVC中验证checkbox 必须选中 (Validation of required checkbox in Asp.Net MVC)
转载自 http://blog.degree.no/2012/03/validation-of-required-checkbox-in-asp-net-mvc/ Why would you want ...
- 删除对象中的key
delete obj.a; delete obj["a"];
- UI进阶 科大讯飞(2) 语音合成(文字转换成语音)
科大讯飞开放平台.SDK下载.添加静态库.初始化见UI进阶 科大讯飞(1) 语音听写(语音转换成文字) 实现语音合成 功能实现步骤: 导入头文件 创建文字识别对象 指定文字识别后的回调代理对象 开启文 ...
- 从scanf的学习接口设计
对大多数程序员来说scanf可以能是最熟悉,也是陌生的工具.在学习C语言时,大家一定没少用它,但是对它也知道不多.比如说,它有哪些可能的返回值?又比如怎么样才能跳过回车,读一个字符?我们可以一起来研究 ...
- C#调用存储过程详解
连接字符串: string conn = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].C ...