Josephus 问题:

一群小孩围成一个圈,任意假定一个数 m,从第一个小孩起,顺时针方向数,每数到第 m 个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小,最后剩下的一个小孩便是胜利者。究竟胜利的是第几个小孩呢?

案例分析:

解答这个问题,首先要定义一个数组,其元素个数就是小孩个数。必须预先设置一个小孩个数常量,以便定义一个数组。

对每个小孩赋以一个序号作为小孩的标志。由于数组是局部作用域的,一旦分配之后,就删不去,得等到作用域结束才会自动抹去,所以当小孩离开时,只能修改该数组元素值来表示小孩的离开。

数组是线性排列的,小孩是围成圈的,用数组表示小孩围成的圈,要有一种从数组尾部跳到数组头部的技巧,这就是“加1取模”。当数到数组尾的时候,下一个数组下标值可以算得为0,从而回到数组首以继续整个过程。程序如下:

#include "stdafx.h"
#include<iostream>
#include<iomanip>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
//建立小孩数组
const int num = ; //小孩个数
int interval; //每次数 interval 个小孩,便让该小孩离开
int a[num]; //小孩数组 //给小孩编号
for(int i=; i<num; i++) //小孩的编号只与小孩的个数有关
a[i]=i+;
//输入小孩间隔 interval
cout<<"please input the interval:";
cin>>interval; //将全体参加的小孩输入
for(int i=; i<num; i++) //顺序输出开始时的小孩编号
cout<<a[i]<<",";
cout<<endl; int k=; //表示处理第 k 个离开的小孩
int i=-; //数组下标(下一个值 0 就是第一个小孩的下标)
//处理获胜前的小孩
while(true)
{
//在圈中数 interval 个小孩
for(int j=; j<interval; )
{
i=(i+) % num; //对下标加 1 取模(使得最后和一个小孩的下一个是第一个小孩)
if(a[i] != ) //如果该小孩在圈中,则承认该数有效
j++;
}
if(k == num)
break; //该小孩是最后的胜利者
cout<<a[i]<<","; //输出离开的小孩编号
a[i] = ; //表示该小孩已经离开
k++; //准备处理下一个圈中的小孩
} //break 语句跳转到此
cout<<endl<<"No."<<a[i]<<"boy's won."<<endl; return ();
}

原文地址:《Visual C++ 编程从基础到应用》 第四章末尾案例

josephus 问题的算法(转载)的更多相关文章

  1. A* 寻路算法[转载]

    A* 寻路算法 转载地址:http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html 原文地址: http://www.gamedev ...

  2. GJM : 数据结构 - 轻松看懂机器学习十大常用算法 [转载]

     转载请联系原文作者 需要获得授权,非法转载 原文作者将享受侵权诉讼 文/不会停的蜗牛(简书作者)原文链接:http://www.jianshu.com/p/55a67c12d3e9 通过本篇文章可以 ...

  3. 解读BloomFilter算法(转载)

    1.介绍 BloomFilter(布隆过滤器)是一种可以高效地判断元素是否在某个集合中的算法. 在很多日常场景中,都大量存在着布隆过滤器的应用.例如:检查单词是否拼写正确.网络爬虫的URL去重.黑名单 ...

  4. 数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++

    数据结构图之三(最短路径--迪杰斯特拉算法)   [1]最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两 ...

  5. AStar算法(转载)

    以下的文章来至http://blog.csdn.net/debugconsole/article/details/8165530,感激这位博主的翻译,可惜图片被和谐了,所以为方便阅读,我重新把图片贴上 ...

  6. 浅谈MySQL索引背后的数据结构及算法(转载)

    转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储 ...

  7. 展开BOM并使用最终用量的算法(转载)

    本文系转载子ITPUB,如果有侵犯您权益的地方,烦请及时的告知与我,我即刻将停止侵权行为: 网址:http://www.itpub.net/thread-1020586-1-1.html http:/ ...

  8. 调用sklearn包中的PLA算法[转载]

    转自:https://blog.csdn.net/u010626937/article/details/72896144#commentBox 1.Python的机器学习包sklearn中也包含了感知 ...

  9. Rsync实现文件同步的算法(转载)

    Rsync文件同步的核心算法 文章出处:http://coolshell.cn/articles/7425.html#more-7425 rsync是unix/linux下同步文件的一个高效算法,它能 ...

随机推荐

  1. app上架的问题

    1..p12证书文件(钥匙串导出)开发证书和描述文件的 2.app打包好重Xcode上传到iTunes中的时候最好做校验: 3.程序跑真机出现的问题 解决方法:debug 模式改成release模式 ...

  2. 在VS2010中使用MySQL-转载

    下面这篇文章进过测试,确实可以.记下来,留作记录. http://blog.sina.com.cn/s/blog_782496390100qjcu.html

  3. mysql优化----explain的列分析

    sql语句优化: : sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 等待时间:看是不是被锁住了,那就不是语句层面了是服务端层面了,看连接数内存. 执行时间:到底取出多少行,一次性取出1万 ...

  4. 用jetty起maven工程debug报source not found

    之前基本都是tomcat启maven本工程 惯性的处理方式是 直接点击lookup source 直接先删除default工程 然后选择导入java project 找到源码所在的工程 但是一般情况下 ...

  5. RedisCluster集群原理

    主从复制,数据值每个服务器都存了. 针对redis集群的解决方案, 连接这个集群,不用在乎Master了 6台redis 1.why use Redis? 减轻数据库访问压力 2.持久化 RDB(间隔 ...

  6. [Selenium] 应对使用 Internet Explorer Driver 多个实例时的 cookie 共享问题

    在使用 IEDriverServer 可执行文件时,从理论上来说是可通过它来创建并使用多个同时存在的 Internet Explorer Driver 实例的.但在实际使用过程中,总是会碰到与 coo ...

  7. iOS 堆和栈的区别和联系

    堆和栈的区别主要有以下五点: 1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作由程序员控制,容易产生memory leak(内存泄露). 2.申请大小: 栈是向低地 ...

  8. iOS成员变量、实例变量、属性变量三者的联系与区别

    一.类Class中的属性property 在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是 ...

  9. RadioGroup和RadioButton

    Activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  10. saltstack自动化运维快速入门

    saltstack自动化运维快速入门 关于saltstack 这个软件是干啥的 我这里就不介绍了 只是简单的说下是干啥的 网上的说法是 它是func的强化版本+ puppet的精简版 关于puppet ...