整型数组能定义为多大的?

今天练习CCF202006-2时遇到一个问题,我需要定义10^9+1那么大的整型数组,但程序运行时老是自动退出,我怀疑是因为10^9太大了,将其改为10^5后果然可正常运行了。我的原始代码如下:

#include<iostream>
#include<math.h>
#include<stdlib.h> 
#include<memory.h>
using namespace std;

const int MAX=1000000000;

int main()
{
    int u[MAX+1], v[MAX+1];
    memset(u, 0, sizeof(u));
    memset(v, 0, sizeof(v));
    
    int n, a, b;
    int index, value;
    int sum=0;
    
    cin>>n>>a>>b;
    while(a--)
    {
        cin>>index>>value;
        u[index]=value;
    }
    while(b--)
    {
        cin>>index>>value;
        v[index]=value;
    }
    
    for(int i=1; i<=MAX+1; i++)
    {
        sum+=u[i]*v[i]; 
    }
    cout<<sum<<endl;
    return 0;
}

经过查询资料,发现原因如下:

我的数组u[MAX+1]和v[MAX+1]声明在了函数内部,属于局部变量,存放在了栈上。

栈的默认内存空间为1M左右。

让我们来算算我的数组占用了多少空间:

10^9*4B =(10^9*4/2^20)MB ≈ (4*1000*1000*1000/1024/1024)MB ≈ 4000MB远大于1MB

所以会导致内存溢出。

怎么解决呢?可以将数组声明在全局存储区或堆上。

修改后的程序如下:

 1 #include<iostream>
 2 #include<math.h>
 3 #include<stdlib.h> 
 4 #include<memory.h>
 5 using namespace std;
 6 
 7 const int MAX=1000000000;
 8 int u[MAX+1];
 9 int v[MAX+1];
10 
11 int main()
12 {
13     
14     memset(u, 0, sizeof(u));
15     memset(v, 0, sizeof(v));
16     
17     int n, a, b;
18     int index, value;
19     int sum=0;
20     
21     cin>>n>>a>>b;
22     while(a--)
23     {
24         cin>>index>>value;
25         u[index]=value;
26     }
27     while(b--)
28     {
29         cin>>index>>value;
30         v[index]=value;
31     }
32     
33     for(int i=1; i<=MAX+1; i++)
34     {
35         sum+=u[i]*v[i]; 
36     }
37     cout<<sum<<endl;
38     return 0;
39 }

可是这样还是不行,嘤嘤嘤,大概是因为10^9真的太大了吧。

改成放在堆上,代码如下:

 1 #include<iostream>
 2 #include<math.h>
 3 #include<stdlib.h> 
 4 #include<memory.h>
 5 using namespace std;
 6 
 7 const int MAX=1000000000;
 8 
 9 int main()
10 {
11     int *u, *v;
12     u=new int[MAX+1];
13     v=new int[MAX+1];
14     memset(u, 0, sizeof(u));
15     memset(v, 0, sizeof(v));
16     
17     int n, a, b;
18     int index, value;
19     int sum=0;
20     
21     cin>>n>>a>>b;
22     while(a--)
23     {
24         cin>>index>>value;
25         u[index]=value;
26     }
27     while(b--)
28     {
29         cin>>index>>value;
30         v[index]=value;
31     }
32     
33     for(int i=1; i<=MAX+1; i++)
34     {
35         sum+=u[i]*v[i]; 
36     }
37     cout<<sum<<endl;
38     delete[] u;
39     delete[] v;
40     return 0;
41 }

注意new了要delete!

这样内存不溢出了,可是运算超~极~慢~,算法不行。

最终修改如下:

 1 #include<iostream>
 2 #include<math.h>
 3 #include<stdlib.h> 
 4 #include<memory.h>
 5 using namespace std;
 6 
 7 const int MAX=1000000000;
 8 
 9 int main()
10 {
11     int *u;
12     u=new int[MAX+1];
13     memset(u, 0, sizeof(u));
14     
15     int n, a, b;
16     int index, value;
17     int sum=0;
18     
19     cin>>n>>a>>b;
20     while(a--)
21     {
22         cin>>index>>value;
23         u[index]=value;
24     }
25     while(b--)
26     {
27         cin>>index>>value;
28         sum+=u[index]*value;
29     }
30     
31     cout<<sum<<endl;
32     delete[] u;
33     return 0;
34 }

原以为会AC的,可是我运行错误了,呜呜呜

修改如下:

 1 #include<iostream>
 2 #include<math.h>
 3 #include<stdlib.h> 
 4 #include<memory.h>
 5 using namespace std;
 6 
 7 const int MAX=1000000000;
 8 
 9 int main()
10 {
11     int *u;
12     int n, a, b;
13     int index, value;
14     int sum=0;
15     
16     cin>>n>>a>>b;
17     u=new int[n+1];
18     memset(u, 0, sizeof(u));
19     while(a--)
20     {
21         cin>>index>>value;
22         u[index]=value;
23     }
24     while(b--)
25     {
26         cin>>index>>value;
27         sum+=u[index]*value;
28     }
29     
30     cout<<sum<<endl;
31     delete[] u;
32     return 0;
33 }

修改成这样只得60,我要哭了

 1 #include<iostream>
 2 #include<stdlib.h> 
 3 #include<memory.h>
 4 using namespace std;
 5 
 6 long long sum=0;
 7 int main()
 8 {
 9     long long *u;
10     int n, a, b;
11     int index, value;
12     
13     cin>>n>>a>>b;
14     u=new long long[n+1];
15     memset(u, 0, sizeof(u));
16     while(a--)
17     {
18         cin>>index>>value;
19         u[index]=value;
20     }
21     while(b--)
22     {
23         cin>>index>>value;
24         sum+=(long long)u[index]*(long long)value;
25     }
26     
27     cout<<sum<<endl;
28     delete[] u;
29     return 0;
30 }

还是60

放弃了放弃了,告辞吧您嘞

原文地址:https://www.cnblogs.com/s-zhou/p/13636444.html