Josephus 问题(2)
一、题目
N人围成一个环,每个人一个编号1—n,然后1、2报数,报2出局,其余人继续,直至最后一人。求该人的编号。有时间限制
二、分析
找规律: 我直接写出了n从1—17的最终答案,分别为:1、1、3、1、3、5、7、1、3、5、7、9、11、13、15、1…发现其是以2的幂次方为一个轮回,然后奇数增长。
分开更容易看清:
第一轮:1
第二轮:1、3
第三轮:1、3、5、7
第四轮:1、3、5、7、9、11、13、15
…
个数刚好为1、2、4、8…
编写代码思路:首先我们要确定所给的数n是经历了几轮这样的循环,然后再确定是这一轮的哪个位置即可算出结果。
这里我们设为x轮,则有
这里c为一个变量。我们把所给数n放在第x+1轮,其前面总有x轮(x>=0)。
①求x:
因为有2^x-1+c=n,两边取对数:x=log2(n)-log2(c-1);
由于为整数,所以x=log2(n)向下取整即可(代码中已经自动实现向下取整,故不必考虑)。
c语言编程实现,可以使用log()函数。不过log()函数以10为底的,我们可以利用对数函数的换底公式。
于是则有:log2(n)=log10(n)除以log10(2)。
代码实现为: x = log(n)/log(2);
在求出经历x轮后,还得求出是第x+1轮的哪个位置。这里设为num,
②求num:
因为有2^x+num=n,故num=n-2 ^x。
③算出结果y
根据1,3,5,7……这样的规律
y=2*num+1。
三、算法实现
int main()
{long long n,x,y,num;while(scanf("%lld",&n)!=EOF){x = log(n)/log(2);//计算出经历的轮数。num=n-pow(2,x);//所在的轮数的第num位上y=2*num+1;//求最终值。printf("%lld\n",y);}return 0;
}
四、算法分析
此算法为公式计算,故可以得出其时间复杂度为O(1).根据程序,易知空间复杂度为O(1)。 感受数学在编程过程中的无比魅力,数学思维很重要
Josephus 问题(2)相关推荐
- Josephus Problem的详细算法及其Python, Java语言的实现
笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争--马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20170627/15491157_0. ...
- 数据结构源码笔记(C语言):Josephus问题之顺序表
/*josephus_seq.c*/ /*Josephus问题: 顺序表实现*/#include <stdio.h> #include <stdlib.h>#define FA ...
- 数据结构源码笔记(C语言):Josephus问题之循环链接表
/*josephus_clist.c*/ /*Josephus问题:循环链接表实现*/#include <stdio.h> #include <stdlib.h>#define ...
- Josephus 问题相关
package com.bupt.syc;import java.util.Iterator; import java.util.LinkedList;import org.junit.Test;pu ...
- 约瑟夫问题(Josephus Problem)的两种快速递归算法
参考:http://haoyuanliu.github.io/2016/04/18/Josephus/ 转载于:https://www.cnblogs.com/xiaoshayu520ly/p/102 ...
- C/C++02: Josephus问题
据说著名犹太历史学家Josephus有过以下的故事: 在罗马人占领乔塔帕特後,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41个 ...
- Josephus问题的Java解决方法
问题描述: 有N个人被困荒岛,岛上的资源只够1个人生存.他们决定通过以下方式减少生存人数. 所有人围成一圈,并依次编号为0至N-1.从第0号开始报数,报数从1至M,报到M号的人会被杀死. 被杀者后面的 ...
- 转贴:Josephus问题
原文地址及原作者不详 1. 问题的由来 Josephus问题是以10世纪的著名历史学家Flavius Josephus命名的. 据说, Josephus如果没有数学才能, 他就不会在活着的时候出名! ...
- Josephus问题(最后一个退出的人)
[问题:]如果有 m 个人围成一圈而坐,每个人的位置都带编号,编号从 1 到 m (没有重复的),从第一个位置开始数数,当数到 n 时,那个人退出圈子,再从退出的那个人的下一个位置开始数(假定是顺时针 ...
- (python)约瑟夫(Josephus)个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿
约瑟夫(Josephus)环问题 题目:n个人围成一圈,并按顺时针依次编号1-n.从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿 ...
最新文章
- 无需用户输入!Adobe提出自动生成高质量合成图像新方法
- php7.2 mysql 教程_如何在PHP7中扩展mysql,先安装php7.2。后安装mysql
- 转 layer的Icon样式以及一些常用的layer窗口使用
- 洛谷 P1024 一元三次方程求解
- iOS 获取当前对象所在的VC
- spring mvc拦截器_Spring MVC拦截器示例
- 解密android日志xlog,XLog 详解及源码分析
- python去除行末符EOL的一般方法
- Java-JUC(六):创建线程的4种方式
- 多线程java_敞开心扉,一起聊聊Java多线程
- 基于Snap软件将2A哨兵数据转换为ENVI格式
- 已删除的QQ好友聊天记录怎么查看
- Web 开发权威指南
- g++编译so里调用外部so
- 音频编码知识与技术参数,常用音频协议介绍
- 函数的定义、调用和声明
- OEPNCV 轮廓提取函数findContours中所用的算法原理疑问。
- 考研数学随笔(2)——微分积分关系,中值定理
- c语言成语接龙编程,C语言完成成语接龙小游戏
- Java EE 概览
热门文章
- 微信电商小店开张:并非剑指淘宝 而是抄底天猫
- Mybatis里的Mapper; 组合查询;多条件查询;模糊查询
- B站热榜视频,炒股源码来了!
- UE4中Actor、Pawn、Character等各种类的详细了解。
- 基于springboot线上买菜系统
- 如何使用会声会影制作手机竖屏效果
- Axure RP Pro - Download下载 - Axure RP Pro 5.0.0.1515
- Python-PyQt5 简易画板实现(QPainter)
- 阿里、百度、华为:中国智能城市马拉松赛道上的三个技术高度
- 王达“收徒、开班”啦!