【问题标题】:Caught Fatal Signal 11 when solving vector problem解决矢量问题时捕获致命信号 11
【发布时间】:2021-10-30 01:39:06
【问题描述】:

我试图解决以下问题:“给出了 n 个数字。对于其中的每一个,计算总和 1+(1+2)+(1+2+3)+...+(1+ 2+3+...+x) 并将结果输出到单独的向量中”。我已经得到了一个求和公式,并将其实现到 C++ 中。该代码似乎在 vs 代码上完美运行,但是当我将它上传到我遇到问题的网站时,我得到 0 分,并解释为:Caught fatal signal 11. 我读过一些文章,但没有一篇有帮助我解决问题。代码如下:

#include <iostream>
#define N 1000000

using namespace std;

int v[N], s[N];

int main()
{
    int n, i;
    cin >> n; // user inputs number of elements
    for(i = 0; i < n; i++)
    {
        cin >> v[i]; // user inputs the elements
        s[i] = v[i]*(v[i] + 1)*(v[i] + 2) / 6; // another vector is calculated using the formula
        cout << s[i] << " ";
    }
    return 0;
}

【问题讨论】:

  • 当用户输入一个非常大的数字(大于N)时会发生什么?还是负面的? (反问。)
  • 你有大量的静态数组分配,在最好的情况下是非常浪费的,在最坏的情况下甚至不够大。使用实际的std::vector&lt;int&gt;
  • 你为什么要使用数组?您不使用以前的值,那么为什么要存储它呢? int num; cin&gt;&gt;num; cout&lt;&lt;(num*(num+1)*(num+2)/6)&lt;&lt;" "; 应该具有完全相同的行为。
  • 该解决方案不需要数组 - 只需读取每个值 x 并输出所需的结果。

标签: c++ algorithm math formula


【解决方案1】:

您的问题有两个方面。一,你没有使用向量,你使用的是 C 风格的数组。第二,由于 C 样式数组的大小,内存不足。

C 风格的数组是在栈上分配的,栈上只有有限的内存。因此,如果你分配两个大小的数组,我不知道,1000000,你可能会遇到一些内存问题。

另一方面,C++ 向量更现代,允许动态调整大小(当你不知道要拥有多少个元素时很有用,我怀疑你会拥有 1000000 个元素),而且它也是内存存储在堆上,在内存方面给你更多的喘息空间。

向量的工作方式如下:

#include <vector>

std::vector<int> vec; // creates the vector

vec.push_back(5); // adds an element equal to 5 to the vector, vec size is now 1
vec.push_back(6); // adds an element equal to 6 to the vector, vec size is now 2

std::cout << vec[0]; // elements are accessed just like a C-style array

【讨论】:

  • 如果你知道你期望有多少元素,你可以为向量保留内存。
  • @AndyG 考虑到整个#define N 1000000 事情,我想忽略这个事实。
  • 在OP的例子中,vsC风格的数组存储在静态存储区的BSS中。不在堆栈上。
  • 是全局变量/数组/等。存放在那里?嗯。不知道那个。谢谢。
猜你喜欢
  • 2019-08-27
  • 2012-09-16
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
相关资源
最近更新 更多