一、题目

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)相关推荐

  1. Josephus Problem的详细算法及其Python, Java语言的实现

      笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争--马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20170627/15491157_0. ...

  2. 数据结构源码笔记(C语言):Josephus问题之顺序表

    /*josephus_seq.c*/ /*Josephus问题: 顺序表实现*/#include <stdio.h> #include <stdlib.h>#define FA ...

  3. 数据结构源码笔记(C语言):Josephus问题之循环链接表

    /*josephus_clist.c*/ /*Josephus问题:循环链接表实现*/#include <stdio.h> #include <stdlib.h>#define ...

  4. Josephus 问题相关

    package com.bupt.syc;import java.util.Iterator; import java.util.LinkedList;import org.junit.Test;pu ...

  5. 约瑟夫问题(Josephus Problem)的两种快速递归算法

    参考:http://haoyuanliu.github.io/2016/04/18/Josephus/ 转载于:https://www.cnblogs.com/xiaoshayu520ly/p/102 ...

  6. C/C++02: Josephus问题

    据说著名犹太历史学家Josephus有过以下的故事: 在罗马人占领乔塔帕特後,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41个 ...

  7. Josephus问题的Java解决方法

    问题描述: 有N个人被困荒岛,岛上的资源只够1个人生存.他们决定通过以下方式减少生存人数. 所有人围成一圈,并依次编号为0至N-1.从第0号开始报数,报数从1至M,报到M号的人会被杀死. 被杀者后面的 ...

  8. 转贴:Josephus问题

    原文地址及原作者不详 1. 问题的由来 Josephus问题是以10世纪的著名历史学家Flavius Josephus命名的. 据说, Josephus如果没有数学才能, 他就不会在活着的时候出名! ...

  9. Josephus问题(最后一个退出的人)

    [问题:]如果有 m 个人围成一圈而坐,每个人的位置都带编号,编号从 1 到 m (没有重复的),从第一个位置开始数数,当数到 n 时,那个人退出圈子,再从退出的那个人的下一个位置开始数(假定是顺时针 ...

  10. (python)约瑟夫(Josephus)个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿

    约瑟夫(Josephus)环问题 题目:n个人围成一圈,并按顺时针依次编号1-n.从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿 ...

最新文章

  1. 无需用户输入!Adobe提出自动生成高质量合成图像新方法
  2. php7.2 mysql 教程_如何在PHP7中扩展mysql,先安装php7.2。后安装mysql
  3. 转 layer的Icon样式以及一些常用的layer窗口使用
  4. 洛谷 P1024 一元三次方程求解
  5. iOS 获取当前对象所在的VC
  6. spring mvc拦截器_Spring MVC拦截器示例
  7. 解密android日志xlog,XLog 详解及源码分析
  8. python去除行末符EOL的一般方法
  9. Java-JUC(六):创建线程的4种方式
  10. 多线程java_敞开心扉,一起聊聊Java多线程
  11. 基于Snap软件将2A哨兵数据转换为ENVI格式
  12. 已删除的QQ好友聊天记录怎么查看
  13. Web 开发权威指南
  14. g++编译so里调用外部so
  15. 音频编码知识与技术参数,常用音频协议介绍
  16. 函数的定义、调用和声明
  17. OEPNCV 轮廓提取函数findContours中所用的算法原理疑问。
  18. 考研数学随笔(2)——微分积分关系,中值定理
  19. c语言成语接龙编程,C语言完成成语接龙小游戏
  20. Java EE 概览

热门文章

  1. 微信电商小店开张:并非剑指淘宝 而是抄底天猫
  2. Mybatis里的Mapper; 组合查询;多条件查询;模糊查询
  3. B站热榜视频,炒股源码来了!
  4. UE4中Actor、Pawn、Character等各种类的详细了解。
  5. 基于springboot线上买菜系统
  6. 如何使用会声会影制作手机竖屏效果
  7. Axure RP Pro - Download下载 - Axure RP Pro 5.0.0.1515
  8. Python-PyQt5 简易画板实现(QPainter)
  9. 阿里、百度、华为:中国智能城市马拉松赛道上的三个技术高度
  10. 王达“收徒、开班”啦!