为啥这只是一个角落案例失败?问题链接-https://www.hackerearth.com/problem/algorithm/chandu-and-his-interns/description/

Posted

技术标签:

【中文标题】为啥这只是一个角落案例失败?问题链接-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为什么这只是一个角落案例失败?问题链接-https://www.hackerearth.com/problem/algorithm/chandu-and-his-interns/description/#c190148 【发布时间】:2019-07-14 20:39:46 【问题描述】:

为什么这只是一个角落案例失败?问题链接-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;   
    



【问题讨论】:

请提供您使用的实际输入、实际输出和预期输出的列表。否则很难理解你的意思是什么“极端情况”。 那些定义真的很混乱...:/ 我建议使用标准 C++ 并避免任何扩展,例如变长数组。 请不要重新定义语言关键字,如果你这样做,它甚至不应该编译。 @vandench 这是未定义的行为,所以标准允许编译器做任何事情。 【参考方案1】:

这似乎是堆栈溢出。

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

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

如果您将该行移至基于非堆栈的分配,例如通过

static int prime[10000009];

然后所有测试通过。

【讨论】:

【参考方案2】:

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

int max=10000009;
int prime[max];

所以它应该是这样的

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

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

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

【讨论】:

以上是关于为啥这只是一个角落案例失败?问题链接-https://www.hackerearth.com/problem/algorithm/chandu-and-his-interns/description/的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用案例类在 DataFrame 上映射失败并显示“无法找到存储在数据集中的类型的编码器”?

flume案例支持

为啥在方法中使用 require_once 有时会失败?

为啥 GridBagLayout 将我的组件居中而不是放在角落里?

为啥zinemaker会出现动态链接库初始化例程失败

使用openCV部分识别角落页面失败