发现了一个神奇的现象,求大佬解惑

P1217 [USACO1.5] 回文质数 Prime Palindromes

xdhking @ 2024-12-06 22:26:02

这段代码用devc++,用vs测试都是正常能出正确答案的,但是放洛谷就显示编译失败四个字没有任何说明, 我开始以为是英文名导致命名冲突了,然后在每个函数名后面加了下划线,把所有英文名变量换成了一个字母发现还是编译失败,我已经不知所措了

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

bool f[100000000] = { 1,1 };
int sum;
//质数筛
void Prime_() {
    for (unsigned long long i = 2; i < 100000000; i++) {
        if (f[i] == false) {
            for (unsigned long long j = i * i; j < 100000000; j += i) {
                f[j] = true;
            }
        }
    }
    return;
}
//求出位数
int Digit_(int n) {
    int cnt = 0;
    while (n) {
        n /= 10;
        cnt++;
    }
    return cnt;
}
//用来构造回文数,判断是否为质数,并输出,x为位数,y为递归的层数
void Function_(int& l, int& r, int x, int y) {
    if (x == 1) {//当只有一位数的情况,只有5,7满足
        for (int i = 5; i <= 7; i += 2) {
            if (i >= l && i <= r)
                cout << i << endl;
        }
        return;
    }
    else if (x == 2) {//当位数为2时只有11满足
        if (11 >= l && 11 <= r)
            cout << 11 << endl;
        return;
    }
    else if ((x & 1)== 0)//除了2,当位数为偶数时都不满足回文质数
        return;
    else {
        if (y > (x / 2) + 1) {//递归构造回文数
            if (f[sum] == false && sum <= r && sum >= l)
                cout << sum << endl;
            return;
        }
        else {
            int t = (x / 2) + 1;
            for (int i = 0; i <= 9; i++) {
                if (i == 0 && y == 1)//首位数字不能为0
                    continue;
                else {
                    if (y != t)//中间的数不需要加两次
                        sum += int(pow(10, t - y + 1) * i + pow(10, y - 1) * i);
                    else
                        sum +=int( pow(10, t - y + 1) * i);
                    Function_(l, r, x, y + 1);
                    if (y != t)
                        sum -= int(pow(10, t - y + 1) * i + pow(10, y - 1) * i);
                    else
                        sum -= int(pow(10, t - y + 1) * i);
                }
            }
        }
    }
    return;
}

int main() {
    int l, r, d1, d2;
    Prime_();
    cin >> l >> r;
    d1 = Digit_(l);//判断两端的位数
    d2 = Digit_(r);
    for (int i = d1; i <= d2; i++)//遍历能取到的所有位数
        Function_(l, r, i, 1);
    return 0;
}

by Steve_xh @ 2024-12-06 22:30:40

刷新一下能看到报错提示。@xdhking


by Steve_xh @ 2024-12-06 22:31:39

估计数组开太大了


by xdhking @ 2024-12-06 22:33:48

@Steve_xhOK我试试,但是我上次没用递归做,也开这么大的数组也没报错


by xdhking @ 2024-12-06 22:37:13

@Steve_xh g++: 编译器内部错误:File size limit exceeded signal terminated program as 请提交一份完整的错误报告, 如有可能请附上经预处理后的源文件。 参阅 https://gcc.gnu.org/bugs/ 以获取指示。

上面是报错提示,确实好像是太大了


by denominator @ 2024-12-06 22:37:21

@xdhking 这么大的数组(可能?)能开下,但是注意不要使用大括号给很大的数组赋值。

你应该自己在调用 Prime_(); 前调用 f[0] = f[1] = 1;


by xdhking @ 2024-12-06 22:51:51

@denominator@denominator 非常感谢大佬,这是啥原理啊,我试试看能不能过


by Steve_xh @ 2024-12-06 22:56:46

@xdhking

我猜一下是因为编译器自己把后面的内容补全成初始化信息导致cpp文件过大(?


by Steve_xh @ 2024-12-06 22:59:16

确实去掉大括号就能过编了。但是你的代码似乎 TLE 了


by Steve_xh @ 2024-12-06 22:59:58

好像被卡常了(?


by Terrible @ 2024-12-06 23:07:16

全局区给大数组赋非零初值导致编译时编译内存超限从而被洛谷编译器毙了。


| 下一页