当前位置: 首页 > 知识库问答 >
问题:

为什么我的程序在大量输入时失败了?超过10^5

慕宏博
2023-03-14

我正在学习动态编程,我想解决以下问题:

问题介绍:给你一个基元计算器,它可以用当前数x执行以下三种操作:x乘以2,x乘以3,或者1加到x。你的目标是给定一个正整数n,从数字1开始,找出获得数字n所需的最小运算次数。

任务给定一个整数n,计算从数字1开始获得数字n所需的最小操作数。输入由单个整数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而失败。为什么会这样?如何改进代码?

共有1个答案

韩豪
2023-03-14

您的问题已联机:

std::list<int> path[number+1];

>

  • 它会在堆栈上创建一个std::list变量数组,因此如果数量很大,堆栈会溢出并出现段错误。
  • 此代码从gcc获得警告:

    警告:ISO C++禁止可变长度数组“path”[-wvla]

    错误:非POD元素类型“std::list”的可变长度数组

    所以不要在堆栈上定义巨大的变量。

    相反,您应该做的是使用std::vector,例如将行更改为:

    std::vector<std::list<int>> path(number+1);
    

    那你的问题就解决了。

  •  类似资料:
    • 认证之后,如果我调用任何方法,比如< code>os.compute()。口味()。list()或< code>os.images()。list(),我得到< code >连接超时。为什么会这样? 我在GoogleCloudsPlataform VM上设置了一个带有RDO包堆栈的OpenStack。我正在对域和项目进行身份验证。我尝试了没有项目的身份验证,方法调用没有超时,但是响应是错误的,例如,

    • 我试图解决Dijkstra算法上的一个hackerrank问题--https://www.hackerrank.com/challenges/dijkstrashortreach。我在使用我自己的Dijkstra代码逻辑。虽然我的代码解决了更容易的测试用例,但它在更高的测试用例上失败了。我猜我的代码在某个地方缺少了一些传递性,并且我得到的某个节点的值高于预期。你能帮我找出我的错误吗?问题:输入格式

    • 我正在使用Angular2 final(2.0.2)和angular cli。我正在尝试将其设置为使用PhantomJS运行单元测试。使用Chrome和karma Chrome launcher运行规范-所有测试都通过。在Phantomjs预构建2.1中运行相同的功能。13和karma phantomjs launcher 1.0。2次测试失败。 我添加了phantomjs启动器到插件数组中kar

    • 我可能做了一些非常基本的错误,但我找不到任何关于如何从这一点上站出来的指针,我想知道我如何才能避免这一点。由于我是Scala和Spark的新手,我不确定问题是来自其中一个还是另一个,或者两者都有。我目前正在我自己的笔记本电脑上运行这个程序,它适用于数组长度不是很长的输入。提前谢了。

    • 是的,我知道《埃拉托斯特尼筛》在标准的图书馆Prime类中,但我正在尝试实现自己的练习。 我正在逐字逐句地按照维基百科上的描述进行操作: 通过Eratosthenes的方法找到所有小于或等于给定整数n的素数:1.创建一个从2到n的连续整数列表:(2,3,4,…, n)。 2.最初,让p等于2,第一个素数。 3.从p开始,通过以p为增量计数到n来枚举其倍数,并在列表中标记它们(这些将是2p,3p,4

    • 我目前有一个问题,一个'而'循环不执行。如果输入文本文件有下一行,我将循环条件设置为true。然而,当我执行我的程序时,循环没有运行。我通过添加一个“System.out.println(text)”来确认这一点,正如我所怀疑的,没有产生任何文本。 什么问题导致循环无法执行?