读取超过500000个整数时,c ++程序无法执行

时间:2015-02-17 20:15:40

标签: c++

我有一个项目,我必须存储一些值并根据它们返回一些结果。结果和存储的值都是整数。我已经将每个变量设置为long long int,以便它绝对符合数字(数组可能长达1000000)。虽然我在存储的最多400000个数字上获得了完全正常的值,但我在低时间(0.25秒)内得到它们,在500000上,程序无法执行。如果我的防病毒软件已启用,它甚至会在我尝试构建或运行它时删除可执行文件。但是在构建时,程序本身不会显示任何语法错误。有任何想法吗?

以下代码:

#include <iostream>
#include <fstream>
using namespace std;
int main() {
  ifstream TextIn;
  ofstream TextOut;
  long long int N, i=1, sum=0;
  TextIn.open("share.in", ios::in);
  TextIn >> N;
  long long int A[N];

  for (i=1; i<=N; i++) {
    TextIn >> A[i];
    sum=sum+A[i];
  }

  TextIn.close();
  long long int sum1c2=0, sum1c1=0;
  i=0;

  do {
    i=i+1;
    sum1c1=sum1c1+A[i];
  } while ((sum1c1<=2+sum/3) && (i<N-2));

  sum1c2=sum1c1-A[i];
  long long int sum2c1c1=0, sum2c1c2=0, sum2c2c1=0, sum2c2c2=0, j=i-1;

  do {
    j=j+1;
    sum2c1c1=sum2c1c1+A[j];
  } while ((sum2c1c1<=2+sum/3) && (j<N-1));

  sum2c1c2=sum2c1c1-A[j];
  j=i;

  do {
    j=j+1;
    sum2c2c1=sum2c2c1+A[j];
  } while ((sum2c2c1<=2+sum/3) && (j<N-1));

  sum2c2c2=sum2c2c1-A[j];
  long long int sum3c1, sum3c2, sum3c3, sum3c4;
  sum3c1=sum-sum1c1-sum2c2c1;
  sum3c2=sum-sum1c1-sum2c2c2;
  sum3c3=sum-sum1c2-sum2c1c1;
  sum3c4=sum-sum1c2-sum2c1c2;
  long long int max1=0, max2=0, max3=0, max4=0;

  if (sum1c1>sum2c2c1) {
    if (sum1c1>sum3c1){
      max1=sum1c1;
    } else {
      max1=sum3c1;
    }
  } else {
    if (sum2c2c1>sum3c1) {
      max1=sum2c2c1;
    } else {
      max1=sum3c1;
    }
  }
  if (sum1c1>sum2c2c2) {
    if (sum1c1>sum3c2) {
      max2=sum1c1;
    } else {
      max2=sum3c2;
    }
  } else {
    if (sum2c2c2>sum3c2) {
      max2=sum2c2c2;
    } else {
      max2=sum3c2;
    }
  }
  if (sum1c2>sum2c1c1) {
    if (sum1c2>sum3c3) {
      max3=sum1c2;
    } else {
      max3=sum3c3;
    }
  } else {
    if (sum2c1c1>sum3c3) {
      max3=sum2c1c1;
    } else {
      max3=sum3c3;
    }
  }
  if (sum1c2>sum2c1c2) {
    if (sum1c2>sum3c4) {
      max4=sum1c2;
    } else {
      max4=sum3c4;
    }
  } else {
    if (sum2c1c2>sum3c4) {
      max4=sum2c1c2;
    } else {
      max4=sum3c4;
    }
  }

  long long int final_max;
  if (max1<=max2 && max1<=max3 && max1<=max4) {
    final_max = max1;
  } else if (max2<=max1 && max2<=max3 && max2<=max4) {
    final_max = max2;
  } else if (max3<=max1 && max3<=max2 && max3<=max4) {
    final_max = max3;
  } else {
    final_max = max4;
  }

  TextOut.open("share.out", ios::out);
  TextOut << final_max;
  TextOut.close();
  return 0;

}    

3 个答案:

答案 0 :(得分:4)

cannot declare an array with runtime size on the stack未使用编译器扩展。所以long long int A[N];是非法的。

用500000元素数组说,你可能会遇到堆栈溢出。你应该做一些像

这样的事情
TextIn >> N;
std::vector<long long int> A(N);
for (long long int i = 1; i < N; ++i)
{
    TextIn >> A[i];
    sum += A[i];
}
TextIn.close();

这会有所帮助的原因是即使在堆栈上声明了向量A,底层内存也是从堆中分配的,堆中的内存比堆栈多得多。

答案 1 :(得分:1)

使用运行时值在C ++中创建数组,因为数组中的条目数不合法C ++。有些编译器可以使用扩展来实现这一点,但它仍然意味着代码使用的是非标准的C ++语法。

要解决此问题,除了可能解决您的问题之外,请使用std::vector代替数组:

TextIn >> N;
std::vector<long long int> A(N);

第二个问题是你的程序中至少有一次内存覆盖:

for (i=1;i<=N;i++)
{
    TextIn >> A[i];
    sum=sum+A[i];
}

数组在C ++中的索引从0开始,而不是1,然后转到n-1,其中n是条目的总数。所以上面的循环应该是:

for (i=0;i <N; i++)
{
    TextIn >> A[i];
    sum=sum+A[i];
}

答案 2 :(得分:0)

如果没有查看你的代码,我会说500000个整数是一个非常大的数字。让我们假设每个整数8个字节(我认为这是长整数的最小长度)。

500000 * 8 == 4000000字节或4兆字节,如果不是,可能接近程序堆栈的大小。

解决方案:如果要存储大量数据,请尝试使用堆内存。

虽然这可能不是问题,特别是如果防病毒标记它(这对我来说似乎很奇怪)。如果是这种情况,您的程序将会出现段错误。