先求出2----1000 000之间的素数,放在prime数组内,如果n是含有某个整数的平方数,那么n能连续两次除以prime[ i ],现在从小到大,依次除,如果除完2----1000000的素数后,如果能连续被某个素数整除两次,输出no;否则 n=1,那么输出yes,n!=1,判断对n开平方是否为整数,如果是整数,输出no。
n的范围到达10^18,而数组开1000 000的原因如下:1000 000^3=10^18,如果n不存在10^6以下的因子,那么n是素数,或者是某个大于10^6的素数的平方数(如果次数大于2,那么n的范围不满足题意,如果有小于10^6的数,那么早已经被除掉了)
代码如下:
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>
#define eps 1e-9
#define N 1000000
#define P system("pause")
using namespace std;
bool vis[N];
int prime[N];
int c;
void is_prime() //筛法求2---1000 000之间的素数
{
memset(vis,0,sizeof(vis));
c=0;
for(int i=2;i <= 1000;i++)
if(!vis[i]){
//prime[c++]=i;
for(int j=i*i;j<=N;j+=i)
vis[j]=1;
}
for(int i=2;i<=N;i++)
if(!vis[i])
prime[c++]=i;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);cc
int t,i,z=1,count;
__int64 n;
is_prime();
scanf("%d",&t);
while(t--)
{
// int flag=0;
scanf("%I64d",&n);
for(i=0;i<c;i++) //依次除以素数
{
count=0;
while(n%prime[i]==0)
{
count++;
n/=prime[i];
}
if(count>1)break; //存在整数平方的因子
}
printf("Case %d: ",z++);
if(count>1) { printf("No\n"); continue ; }
if(n==1) {printf("Yes\n"); continue ; }
long double k=sqrt( (long double)n );
if( k ==floor(0.5+k)) //判断某个数是否为整数
printf("No\n");
else
printf("Yes\n");
}
//P;
return 0;
}