为什么这只是一个角落案例失败了?问题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];
然后所有测试都通过。
为什么这只是一个极端案例失败了?问题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];
然后所有测试都通过。