「已注销」 2023-09-24 17:40 采纳率: 0%
浏览 3

11111111111111111111111


//约瑟夫问题
//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/
 
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-24 20:54
    关注

    【以下回答由 GPT 生成】

    约瑟夫问题的实现优化方案

    为了优化这段代码并解决约瑟夫问题,你可以考虑以下几点改进:

    1. 避免使用固定大小的数组。将数组大小设为1000可能会浪费内存,并且有可能导致内存溢出的错误。相反,你可以使用动态数组或者STL容器(如vector)来存储猴子的状态。
    vector<int> a(n, 1); // 创建vector,大小为n,初始值为1
    
    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--; // 更新剩余猴子数量
    }
    
    1. 添加边界检查。在输入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--;
        }
    }
    

    希望这个优化方案能帮助到你!如果你有任何问题,请随时提问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 提问应符合社区要求 9月25日
  • 创建了问题 9月24日