为什么我的程序是失败的大输入?大于10^5
Why my program is failing for large input? more than 10^5
我正在学习动态规划。我想解决以下问题:
问题介绍:给您一个原始计算器,它可以对当前数字执行以下三种操作x:将x乘以2,将x乘以3,或将1加x。给定一个正整数n,求从1开始得到n所需的最小运算次数。
给定一个整数n,计算获得数字n所需的最小操作次数从数字1开始。输入包含单个整数1 如果输入的数字大于10^5,程序会失败。为什么会这样?我该如何改进代码?#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;
}
您的问题在线:
std::list<int> path[number+1];
- 它在堆栈上创建一个
std::list
变量数组,所以如果数量很大,堆栈会溢出并导致段错误。 - 这个代码从GCC获得警告:
警告:ISO c++禁止可变长度数组'path' [-Wvla]
- 也被clang拒绝:
错误:非pod元素类型'std::list'的可变长度数组
std::vector
,例如,将行改为:
std::vector<std::list<int>> path(number+1);
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 读取文件并输入到矢量中
- C++如何通过用户输入删除列表元素
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 如果用户输入的输入大于 char 数组,则 cin.getline 会跳过输入提醒
- Zlib 放气输入大于原始输入字符串的字符
- 为什么代码在输入大于10的输入上会分割故障
- 显示用户输入的平均数大于 50 和所有可被 3 整除的数字的乘积
- C 用户输入4个数字,并且该程序检查它们大于少于
- 为什么此代码只能识别文本文件中的第一行?输入任何大于 1 的数字都会返回"Atomic Number Not Found"
- 当运算符尝试输入大于变量可以包含的值>>会发生什么情况?
- 如果输入大于零,是否有一行用于从输入中减去 1
- 检查输入文件值是否大于10^9
- 检查输入是否为整数或大于零
- 为什么我的程序是失败的大输入?大于10^5