为什么这只是一个角落案例失败了?问题link-https://www.hackerearth.com/problem/algorithm/chandu-and-his-interns/description/#c190148

Why is this failing for just a corner case? Question link-https://www.hackerearth.com/problem/algorithm/chandu-and-his-interns/description/#c190148

为什么这只是一个极端案例失败了?问题link-https://www.hackerearth.com/problem/algorithm/chandu-and-his-interns/description/#c190148 它 运行 对于所有其他情况都很好。 我把除数可能小于 4 的所有三种情况都考虑了。(素数,1 和素数的平方)

#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(i=0;i<n;i++)
#define ll long long
#define elif else if 
#define ff first 
#define ss second
#define pii pair<ll int ll int>
#define mp make_pair
#define pb push_back
#define CLEAR(array, value) memset(ptr, value, sizeof(array));
#define si(a)     scanf("%d", &a)
#define sl(a)     scanf("%lld", &a)
#define pi(a)     printf("%d", a)
#define pl(a)     printf("%lld", a)
#define pn        printf("\n")
#define int long long int 

int32_t main()
{

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n,x,t,i;
    cin >> n;
    int max=10000009;
    int prime[max];
    int j;

    for(int i=2; i*i<=max; i++)
    {
        if (prime[i]==0)
        {
            for(j=i*i; j<=max; j+=i)
            {
                    prime[j]=1;

            }
        }
    }
    rep(i,n)
    {
        cin >> x;    
        t=sqrt(x);
        if (prime[x]==0)
             cout << "NO" << endl;
        else if ((t*t)==x && prime[t]==0)
             cout << "NO" << endl;
        else
             cout << "YES" << endl;   
    }


}

您应该将这两行移到 main 函数之外并重命名 max 变量,因为它会变得不明确。此外 max 变量应该是 constant 因为 ISO C++ 禁止可变长度数组:

int max=10000009;
int prime[max];

所以它应该是这样的

const int maximum=10000009;
int prime[maximum];

然后它通过了所有测试用例。

不应该在 main 中分配如此大的数组,除非您不增加堆栈大小或使用动态内存分配,否则会导致堆栈溢出。 Here 您可以阅读更多相关信息。

这似乎是堆栈溢出。

您正在分配堆栈上的素数数组。

失败的测试用例是值 9999863,它接近素数数组的末尾。

如果您将该行移动到基于 non-stack 的分配,例如通过

static int prime[10000009];

然后所有测试都通过。