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

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

  • 相关阅读:
    mysql数据库常用指令
    解决windows的mysql无法启动 服务没有报告任何错误的经验。
    “Can't open file for writing”或“operation not permitted”的解决办法
    启动Apache出现错误Port 80 in use by "Unable to open process" with PID 4!
    如何打开windows的服务services.msc
    常见的HTTP状态码 404 500 301 200
    linux系统常用的重启、关机指令
    (wifi)wifi移植之命令行调试driver和supplicant
    linux(debian)安装USB无线网卡(tp-link TL-WN725N rtl8188eu )
    alloc_chrdev_region申请一个动态主设备号,并申请一系列次设备号
  • 原文地址:https://www.cnblogs.com/s-zhou/p/13636444.html
Copyright © 2011-2022 走看看