zoukankan      html  css  js  c++  java
  • 整型数组能定义为多大的?

    今天练习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

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

  • 相关阅读:
    ICONS-图标库
    图形资源
    vue项目中,如果修改了组件名称,vscode编辑器会在引入修改组件的名字处提示红色波浪线 The file is in the program because:Imported via xxx Root file specified for compilation .
    接口在dev环境报跨域问题(has been blocked by CORS policy:Response to preflight request doesn't pass access control check:No 'Access-Control-Allow-Origin' header ispresent on the requested resource.),qa环境正常
    阿里云occ的图片文件URL用浏览器直接打开无法访问,提示This XML file does noe appear to have any style information associated with it. The document tree is shown below.
    vue 项目使用element ui 中tree组件 check-strictly 用法(父子不互相关联的反显情况)
    高德地图进行线路规划绘制标记点操作(vue)
    vue中实现拖拽调整顺序功能
    2021-01-22 浏览器相关知识
    2021-01-22 js 相关知识点
  • 原文地址:https://www.cnblogs.com/s-zhou/p/13636444.html
Copyright © 2011-2022 走看看