首先,约瑟夫环的数学优化方法为:

为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。

我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 n-2, n-1, 0, 1, 2, k-2 并且从k开始报0。约瑟夫环现在我们把他们的编号做一下转换:

k > 0 k+1 > 1 k+2 > 2

n-1 >n-1-k 0> n-k

k-3 > n-3 k-2 > n-2

序列1: 1, 2, 3, 4, …, n-2, n-1, n

序列2: 1, 2, 3, 4, … k-1, k+1, …, n-2, n-1, n

序列3: k+1, k+2, k+3, …, n-2, n-1, n, 1, 2, 3,…, k-2, k-1

序列4:1, 2, 3, 4, …, 5, 6, 7, 8, …, n-2, n-1

变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:

∵ k=m%n;

∴ x = x+k = x+ m%n ; 而 x+ m%n 可能大于n

∴x= (x+ m%n)%n = (x+m)%n 得到 x‘=(x+m)%n

如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。(n-2)个人的解呢?当然是先求(n-3)的情况 - 这显然就是一个倒推问题!好了,思路出来了,下面写递推公式:

令f表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n].

递推公式: f[1]=0; f[i]=(f[i-1]+m)%i; (i>1)

完整的实现代码如下:

/*

约瑟夫环递推公式:令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n]

递推公式 f[1]=0; f[i]=(f[i-1]+m)%i; (i>1)

*/

#include "stdio.h"

#include "stdlib.h"

int main(void)

{

int n, m,i, f[20]={0};

scanf("%d %d",&n,&m);

for(i=2;i<=n;i++)

{

f[i]=(f[i-1]+m)%i;

printf("%d个人报数,报到%d的出列,最后的胜者下标为%d\n", i,m,f[i]);

}

printf("The winner is %d\n", f[n]+1);

system("pause");

}

优化后的代码为:

#include "stdio.h"

#include "stdlib.h"

int main(void)

{

int n, m,i, s=0;

scanf("%d %d",&n,&m);

for(i=2;i<=n;i++)

{

s=(s+m)%i;

}

printf("The winner is %d\n", s+1);

system("pause");

}

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-21674-1.html

python约瑟夫环单向循环链表_约瑟夫环_约瑟夫环单向循环链表_约瑟夫环c语言循环链式...相关推荐

  1. 约瑟夫环c语言单链表的解题思路,太透彻了:约瑟夫环的三种解法

    [CSDN 编者按]极大概率出现在面试中的约瑟夫环问题来啦,本文三种方法描述解题思路,这样讲解绝对让面试官眼前一亮. 作者 | bigsai 责编 | 欧阳姝黎 前言 约瑟夫环问题是算法中相当经典的一 ...

  2. 约瑟夫环c语言代码顺序存储,顺序表实现约瑟夫环地问题,C语言.doc

    顺序表实现约瑟夫环地问题,C语言 计算机科学与工程学院 PAGE PAGE 2 <算法与数据结构>试验报告 计算机科学与工程学院 <算法与数据结构>试验报告[一] 专业班级 1 ...

  3. 约瑟夫环c语言计蒜客链表,约瑟夫环的故事 - osc_3n35hvex的个人空间 - OSCHINA - 中文开源技术交流社区...

    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading. ...

  4. 用C语言编写约瑟夫环程序,约瑟夫环C语言,请高手检查我的程序

    /*TC2编译通过*//*测试了几组数据,没有发现问题*//*如果有问题,再M我*/#include typedef struct Cnode {int data; int password; str ...

  5. 约瑟夫环c语言程序完整版,C语言:约瑟夫环问题(源代码)

    本帖最后由 geige 于 2015-7-26 00:48 编辑 #include #include struct stu //构建一个新的数据类型 { int num; struct stu *ne ...

  6. 约瑟夫环c语言循环指针,约瑟夫环(c语言)(双循环、单循环)

    /*题目: 耶稣又15个门徒,其中有一个时出卖耶稣的叛徒,请用排除法找出这位门徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3...凡是报到"3"的退出圈子,最后留在圈 ...

  7. 简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

    文章目录 简单介绍 代码实现 简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点. 单向环形链表应用场景:Josep ...

  8. 约瑟夫环数据结构c语言程序,数据结构的C语言(类C语言)--单向循环链表--约瑟夫环...

    代码区 约瑟夫环:用类C语言实现!!!可以成功运行!!!不是仅仅的算法,而是实实在在的类C #include #include typedef int ElemType; typedef struct ...

  9. 约瑟夫环代码展示,以及理解约瑟夫环

    本人也是刚刚接触算法,如果有不准确的地方,欢迎大家留言评论,一起学习,一起进步,奥利给! 约瑟夫环的简单的图例(画的太抽象,大家理解下,我有必要去学学画画了!) 约瑟夫环的原理 1.一群人围在一起坐成 ...

  10. 约瑟夫环 java_约瑟夫环Java实现

    /** * 约瑟夫问题 * 设编号为 1,2,- n 的 n 个人围坐一圈, * 约定编号为 k(1<=k<=n)的人从 1 开始报数, * 数到 m 的那个人出列, * 它的下一位又从 ...

最新文章

  1. Java爬虫--json数据处理:JSONObject的使用
  2. A+B Problem III
  3. 设计模式--桥(Bridge)模式
  4. 转 当当网资深DBA:DB运维四大现代化的实现
  5. python 程序运行插件_如何使Python插件在Pluma中运行?
  6. 手把手带你入门Python爬虫(四、ORM与peewee)
  7. 这个世界是那样的似曾相识
  8. SaltStack 介绍和安装
  9. 基于matlab实现人脸识别解析
  10. 锁定计算机后如何显示文字,我的电脑图标和文字后面有拖影怎么去掉
  11. html设备状态监测系统,盾构机状态监测系统
  12. xlsx文件 wps 可以打开 excel 打不开
  13. 问题 I: decimal
  14. day11-字符流、属性集、缓冲流、转换流、序列化流笔记
  15. 【知识分享】异步串行收发器Uart(串口)-通信协议详解
  16. RedHat RHEL7.2  系统安装详细步骤
  17. 诺基亚n8和n9java_诺基亚官方发布 N8与N9的十大区别
  18. 如何寻找已注册dll的路径
  19. 前端在线预览word,excel,pdf
  20. python scapy模块_关于scapy模块

热门文章

  1. C语言课程设计题目介绍(10个标准题目)
  2. 神经网络matlab仿真,神经网络模型及其MATLAB仿真程序设计 周开利 等著 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  3. MAC刻录iso到USB、U盘
  4. gbcbig.shx字体的BUG
  5. 【学习】从零开始的Android音视频开发(2)——MediaPlayer的状态和创建过程
  6. linux系统国产制图软件,国产操作系统也能用的国产图表绘制软件,替代Visio就用它了...
  7. mmap java_Java文件映射[Mmap]揭秘 | 学步园
  8. 利用POI导出excel
  9. 斗鱼mac html5,斗鱼html5插件
  10. pyinstaller遇到的问题总结