我有一个项目,我必须存储一些值并根据它们返回一些结果。结果和存储的值都是整数。我已经将每个变量设置为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;
}
答案 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兆字节,如果不是,可能接近程序堆栈的大小。
解决方案:如果要存储大量数据,请尝试使用堆内存。
虽然这可能不是问题,特别是如果防病毒标记它(这对我来说似乎很奇怪)。如果是这种情况,您的程序将会出现段错误。