C++:利用C++语言实现约瑟夫环问题——利用函数嵌套+交互式实现n只猴子选猴王

简介: C++:利用C++语言实现约瑟夫环问题——利用函数嵌套+交互式实现n只猴子选猴王

输出结果



image.png




实现代码


#include<iostream>    //头文件,识别大部分预处理命令,编译器才会合法识别后边使用的关键字

using namespace std;  //T1、命名空间,包括cout、cin、endl等

/*

函数的嵌套:约瑟夫环问题——n只猴子选猴王的问题

}

*/

//void可知,此函数没有使用返回值

void NextPosition(int &p,int tail)     //p是当前猴子的下标,执行函数之后得到下一个下标,tail表示最后一只猴子的下标

{

p = (p < tail ? p + 1 : 0);        //暂时不考虑被淘汰掉的猴子

}

int NextNumber(int n, int tail)        //当前要报的数字、要报的最大数字

{

return n == tail ? 1 : n + 1;      //

}

int MonkeyKing(int total, int cycle)   //参数输入猴子总数、所报最大数字

{

bool*failure = new bool[total];         //建立total只猴子,为bool型,识别为是否被淘汰

memset(failure, 0, sizeof(bool)*total);  //所有猴子初始化为0即false,即没有被淘汰

//menset函数对数组进行归0,如果要统一赋其他值,可用for循环

int position = total - 1;                //当前位置确定为最后一只猴子,

int said = 0;                            //所报数字

int i;

int remained = total;                    //剩下的猴子个数

while (remained > 1)

{

 NextPosition(position,total-1);      //从当前猴子移动到下一只去

 if (failure[position] = false)       //假如该猴子尚未被淘汰

 {

  said = NextNumber(said, cycle);             //被轮到的猴子应该报到的数

  cout << "第" << position + 1 << "只猴子报" << said;

  if (said==cycle)                            //判断这只猴子报出的数是否为最大值,如果是,则要将其淘汰

  {

   failure[position] = true;               //将这只猴子淘汰出去

   cout << ",被淘汰。剩下" << --remained << "个\n";

  }

  else cout<<"。\n";

 }

}

//for (int i = 0; i < total; i++) if (failure[i] == false) break;  //T1、判断猴子是不是没有被汰淘

for (i = 0; failure[i]; i++);                                  //T2、最简单的一句话

delete []failure;

return i;      //返回没有被淘汰的猴子下标

}

// void   return;     int return 0;

void main()

{

cout << "Hello,world!欢迎来到《一个处女座程序猿》的博客!\n";

int total,cycle;           //定义猴子总数、所报最大数字

cout <<"请输入猴子总数:";          // << endl

cin >> total;

cout << "请输入猴子所报最大数:" ;

cin >> cycle;

cout << "第" << MonkeyKing(total, cycle)+1 <<"个猴子是猴王。\n";

system("pause");

return;

}





相关文章
|
9月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
282 15
|
4月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
481 12
|
6月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
191 0
|
9月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
224 8
|
9月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
506 6
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
343 5
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
164 0
|
存储 分布式计算 编译器
深入计算机语言之C++:C到C++的过度-2
深入计算机语言之C++:C到C++的过度-2
123 0
|
10月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。