//约瑟夫问题
//1946年 世界上第一台计算机
//冯 诺伊曼(匈牙利) 计算机之父
//图灵(英国)
#include<iostream> //导入库 include库是最常见的库
using namespace std; //每句话后都有分号
int main() //主函数 所有程序要写在主函数下
{
//1输入m,n
int n,m,a[1000],count,num; //声明n,m a[100]说明最大数组是100
cin>>n>>m; //输入n,m #cin代表输入
//2猴子的状态全是1
for(int i=1;i<=n;i++) a[i]=1; //i++意思是i=i+1 #int i就创建在里面就可以
//3主循环
num=n;
while(n) //意思是n!=0时 执行:
{
for(int i=1;i<=num;i++) //看看是不是1 先循环一遍 确认状态
{
if(a[i]==1) count++; //如果状态为1,才可以开始计数
if(count==m) //当计数(count=5)时
{
cout << i << "_"; //cout是输出的意思 #输出猴子编号
a[i]=0; //将猴子状态变为0
n--; //总数-1 这只猴子出圈
count = 0; //从0重新数
}
}
}
}
//课后作业:将a数组中的第一个元素移到数组末尾,其余数据依次往前平移一个位置
//2271733510@qq.com
/例:
1234
4123/
11111111111111111111111
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注【以下回答由 GPT 生成】
约瑟夫问题的实现优化方案
为了优化这段代码并解决约瑟夫问题,你可以考虑以下几点改进:
- 避免使用固定大小的数组。将数组大小设为1000可能会浪费内存,并且有可能导致内存溢出的错误。相反,你可以使用动态数组或者STL容器(如vector)来存储猴子的状态。
vector<int> a(n, 1); // 创建vector,大小为n,初始值为1- 优化计数的过程。目前的代码中,每次都需要遍历整个数组来计数,这样效率较低。为了提高效率,你可以通过取模运算来实现计数,使其在O(1)的时间复杂度内完成。
int count = 0; // 计数器,初始化为0 int index = 0; // 当前猴子的下标 while (n) { count = (count + m - 1) % n; // 计数器递增 m-1,然后取模n index = (index + count) % n; // 新的当前猴子下标为 (当前下标 + 计数器) % n cout << index + 1 << "_"; // 输出当前猴子的编号 a.erase(a.begin() + index); // 从数组或容器中移除当前猴子 n--; // 更新剩余猴子数量 }- 添加边界检查。在输入m和n之前,可以添加一些输入验证的逻辑来确保输入的正确性。比如,检查m和n是否为正数,以及m是否小于等于n。
int n, m; cin >> n >> m; if (n <= 0 || m <= 0 || m > n) { cout << "输入不合法" << endl; return 0; }这些优化后的代码将解决你的问题并正确输出约瑟夫问题的结果。完整代码如下所示:
#include<iostream> #include<vector> using namespace std; int main() { int n, m; cin >> n >> m; if (n <= 0 || m <= 0 || m > n) { cout << "输入不合法" << endl; return 0; } vector<int> a(n, 1); int count = 0; int index = 0; while (n) { count = (count + m - 1) % n; index = (index + count) % n; cout << index + 1 << "_"; a.erase(a.begin() + index); n--; } }希望这个优化方案能帮助到你!如果你有任何问题,请随时提问。
【相关推荐】
- 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7581254
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报