根据题意,如果一个数N只有三个约数,那么它的约数一定分别是,1,N,sqrt(N)。也就是只有N / sqrt(N) 与 sqrt(N)相等的时候,他的约数才能是3个,否则就是4个了。
一开始直接写了个sqrt的素数判断,直接TLE了,随后换了个筛法过了……
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXX 1000000
int a[MAXX+1];
void isPrime()
{
a[0] = a[1] = 1;
memset(a, 0, sizeof(a));
for(int i = 2; i <= MAXX; i++)
{
if(!a[i])
{
for(int j = i + i; j <= MAXX; j += i)
{
a[j] = 1;
}
}
}
}
int main()
{
int n;
long long ans;
isPrime();
scanf("%d", &n);
while(n--)
{
scanf("%I64d", &ans);
long long temp = sqrt(ans) + 0.5;
if(ans > 1 && temp * temp == ans && a[temp] == 0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}