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

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


目录

输出结果

实现代码


 

 

 

输出结果

 

 

 

实现代码

1. 
2. #include<iostream>    //头文件,识别大部分预处理命令,编译器才会合法识别后边使用的关键字
3. using namespace std;  //T1、命名空间,包括cout、cin、endl等
4. 
5. /*
6. 函数的嵌套:约瑟夫环问题——n只猴子选猴王的问题
7. }
8. */
9. 
10. 
11. //void可知,此函数没有使用返回值
12. void NextPosition(int &p,int tail)     //p是当前猴子的下标,执行函数之后得到下一个下标,tail表示最后一只猴子的下标
13. {
14.   p = (p < tail ? p + 1 : 0);        //暂时不考虑被淘汰掉的猴子
15. }
16. 
17. int NextNumber(int n, int tail)        //当前要报的数字、要报的最大数字
18. {
19.   return n == tail ? 1 : n + 1;      //
20. }
21. 
22. int MonkeyKing(int total, int cycle)   //参数输入猴子总数、所报最大数字
23. {
24.   bool*failure = new bool[total];         //建立total只猴子,为bool型,识别为是否被淘汰
25.   memset(failure, 0, sizeof(bool)*total);  //所有猴子初始化为0即false,即没有被淘汰
26.   //menset函数对数组进行归0,如果要统一赋其他值,可用for循环
27.   int position = total - 1;                //当前位置确定为最后一只猴子,
28.   int said = 0;                            //所报数字
29.   int i;
30.   int remained = total;                    //剩下的猴子个数
31.   while (remained > 1)
32.   {
33.     NextPosition(position,total-1);      //从当前猴子移动到下一只去
34.     if (failure[position] = false)       //假如该猴子尚未被淘汰
35.     {
36.       said = NextNumber(said, cycle);             //被轮到的猴子应该报到的数
37.       cout << "第" << position + 1 << "只猴子报" << said;
38.       if (said==cycle)                            //判断这只猴子报出的数是否为最大值,如果是,则要将其淘汰
39.       {
40.         failure[position] = true;               //将这只猴子淘汰出去
41.         cout << ",被淘汰。剩下" << --remained << "个\n";
42.       }
43.       else cout<<"。\n";
44. 
45.     }
46.   }
47.   //for (int i = 0; i < total; i++) if (failure[i] == false) break;  //T1、判断猴子是不是没有被汰淘
48.   for (i = 0; failure[i]; i++);                                  //T2、最简单的一句话
49.   delete []failure;
50.   return i;      //返回没有被淘汰的猴子下标
51. }
52. 
53. // void   return;     int return 0;
54. void main()
55. {
56.   cout << "Hello,world!欢迎来到《一个处女座程序猿》的博客!\n";
57.   int total,cycle;           //定义猴子总数、所报最大数字
58.   cout <<"请输入猴子总数:";          // << endl
59.   cin >> total;
60.   cout << "请输入猴子所报最大数:" ;
61.   cin >> cycle;
62.   cout << "第" << MonkeyKing(total, cycle)+1 <<"个猴子是猴王。\n";
63. 
64.   system("pause");
65.   return;
66. }

 


相关文章
|
2月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
51 2
|
2月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
49 0
|
8天前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
13 3
|
2月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
17 1
|
2月前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
20 6
|
20天前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
14 0
|
2月前
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
29 0
c++学习笔记05 函数
|
2月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
32 0
|
2月前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
2月前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数