为什么会在洛谷上编译错误?

P1045 [NOIP2003 普及组] 麦森数

cjr1221 @ 2023-12-26 17:55:30



#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int real[200000000] = { 1,1 };
int main()
{
    int n;
    cin >> n;
    int len = 1;
    while ((n--) > 0 && len <= 500)
    {
        int i = 1;
        int z = 0;
        for (; i <= len; i++)
        {
            real[i] *= 2;
            real[i] += z;
            z = 0;
            while (real[i] >= 10)
            {
                z= real[i] / 10;
                real[i] %= 10;
                if (i==len&&z!=0)
                    len++;

            }
        }
    }
    real[1] -= 1;
    int t = 0;
    for (int i = 500; i > 0; i--)
    {
        cout << real[i];
        t++;
        if (t == 50)
        {
            cout << endl;
            t = 0;
        }
    }
    return 0;
} ```

by Terrible @ 2023-12-26 18:06:38

@cjr1221

int real[200000000] = { 1,1 };

一般请不要用 {} 给一个大数组赋初值,因为这样赋值,数组里每一个值都要对应可执行文件中的一条指令,也就是说会产生 200000000 条指令,导致编写出的可执行文件过大,超过洛谷设置的编译空间上限,从而 CE。(你也不看看你本地的可执行文件.exe 有多大?)特例是,数组放到全局区并全部赋值 0 的操作。由于全局区变量本就会被清零,所以会被编译器优化。

应该改写成 real[0]=real[1]=1 的赋值操作。

另外,你这个数组开太大,明显超过了本题给的空间限制,单论 real 数组也要 762.939453125\;\mathrm{MB} 内存。如果在其他一些评测平台,例如 CF 上,不 CE 也得直接 MLE,但是洛谷可能不会 MLE(如果你不使用额外的空间的话)。


by cjr1221 @ 2023-12-26 18:42:46

@Terrible 谢谢谢谢


|