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

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

  • 相关阅读:
    利用DTrace实时检测MySQl
    改进MySQL Order By Rand()的低效率
    RDS for MySQL查询缓存 (Query Cache) 的设置和使用
    RDS For MySQL 字符集相关说明
    RDS for MySQL 通过 mysqlbinlog 查看 binlog 乱码
    RDS for MySQL Mysqldump 常见问题和处理
    RDS for MySQL Online DDL 使用
    RDS MySQL 表上 Metadata lock 的产生和处理
    RDS for MySQL 如何使用 Percona Toolkit
    北京已成为投融资诈骗重灾区:存好骗子公司黑名单,谨防上当!
  • 原文地址:https://www.cnblogs.com/s-zhou/p/13636444.html
Copyright © 2011-2022 走看看