栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

约瑟夫问题讲解解法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

约瑟夫问题讲解解法

 据说在罗马时期                                                                                                                               犹太士兵被古罗马士兵包围                                                                                                             于是他们决定集体自杀

        自杀的方式是所有的士兵围成一个圆,每个士兵轮流杀掉左边的那个士兵,一直杀到还剩一个,剩下的那个士兵自杀。

        其中有一个士兵叫做约瑟夫,其实他想投降,但是他又不敢明说,所以他想成为最后一名士兵,那么他应该站在哪里?

    目录:

  1. 细节讲解
  2. 暴力思路(懒得写......)
  3. 简易c++思路+解法
1.细节讲解

        所有n个士兵围成一圈,我们将其序号标为1~n,首先我们可以知道(每轮)偶数号必死,将死的剔除,重新编号(这只是思路),偶数号的又必死。而且我们可以发现,如果人数n位2的次方,那么1号肯定是最后剩下的那个人。

2.暴力思路

        从1号开始往后循环,且移动方式为k=(k+移动人数)%n,这是为了防止下标越界,用a数组来存编号,初始化就为0,如果第k个被杀,就标为-1。应该循环到只有一个不为-1,输出。

3.c++思路+解法

具体思路请看这位up主的 (一定要看!)                                你应该站在哪个位置,才能活到最后?_哔哩哔哩_bilibili

上代码

#include 
using namespace std;
int main(){
    int n,p;
    cin >> n;
    for(int i = 0; pow(2,i) <= n; i++) p = i;
    if(pow(2,p) == n) cout << 1 << endl;
    else cout << (n-pow(2,p)) * 2 + 1 << endl;
    return 0;
}

        先循环找出离n最近并小于n的2的次方,然后先将19=2^4+3中的3跳过,再加一个就是2^4这个集合中的1号!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025981.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号