为什么我的程序是失败的大输入?大于10^5

Why my program is failing for large input? more than 10^5

本文关键字:大于 输入 程序 我的 失败 为什么      更新时间:2023-10-16

我正在学习动态规划。我想解决以下问题:

问题介绍:给您一个原始计算器,它可以对当前数字执行以下三种操作x:将x乘以2,将x乘以3,或将1加x。给定一个正整数n,求从1开始得到n所需的最小运算次数。

给定一个整数n,计算获得数字n所需的最小操作次数从数字1开始。输入包含单个整数1

#include <iostream>
#include <climits>
#include<vector>
#include<list>
void primitive_calculator(int number)
{
    std::vector<int> min_steps(number+1,INT_MAX);
    std::list<int> path[number+1];
    min_steps[0]=0; min_steps[1]=0;
    path[0].push_back(0);
    path[1].push_back(1);
    for (int i=2 ; i<=number ; i++)
    {
        if(i%3==0)
        {
            if(min_steps[i/3] < min_steps[i])
            {
                min_steps[i]=min_steps[i/3]+1;
                path[i]=path[i/3];
                path[i].push_back(i);
            }
        }
        if(i%2==0)
        {
            if( min_steps[i/2] < min_steps[i])
            {
                min_steps[i]=min_steps[i/2]+1;
                path[i]=path[i/2];
                path[i].push_back(i);
            }
        }
        if( min_steps[i-1] < min_steps[i])
        {
             min_steps[i]=min_steps[i-1]+1;
             path[i]=path[i-1];
             path[i].push_back(i);
        }
    }
    std::cout<<min_steps[number]<<"n";
    while(!path[number].empty())
    {
        std::cout<<path[number].front()<<" ";
        path[number].pop_front();
    }
}
int main()
{
    int number;
    std::cin>>number;
    primitive_calculator(number);
    return 0;
}

如果输入的数字大于10^5,程序会失败。为什么会这样?我该如何改进代码?

您的问题在线:

std::list<int> path[number+1];
  1. 它在堆栈上创建一个std::list变量数组,所以如果数量很大,堆栈会溢出并导致段错误。
  2. 这个代码从GCC获得警告:

    警告:ISO c++禁止可变长度数组'path' [-Wvla]

  3. 也被clang拒绝:

    错误:非pod元素类型'std::list'的可变长度数组

NOT在栈上定义大变量 相反,你应该做的是使用std::vector,例如,将行改为:
std::vector<std::list<int>> path(number+1);