杭电3826(打素数表)

1.要用long long型。
2.用埃式筛法,只能筛10的6次方,后面的数采用开平方检验。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
#define MAX 1000001
#define LL long long
LL prime[MAX];
int visprime[MAX];
LL n,k;
void isprime()
{
    
    
    for(int i=0;i<MAX;i++)
    {
    
    
        visprime[i]=1;
        prime[i]=0;
    }
    k=-1;
    for(int i=2;i*i<MAX;i++)
    {
    
    
        if(visprime[i])
        {
    
    
            for(int j=2*i;j<MAX;j=j+i)
            {
    
    
                visprime[j]=0;
            }
        }
    }
    for(int i=2;i<MAX;i++)
    {
    
    
        if(visprime[i])
        {
    
    
            //cout<<i<<" ";
            prime[++k]=i;
        }
    }
}
int finsh()
{
    
    
    for(int i=0;i<k;i++)
    {
    
    
        if(n%prime[i]==0)
        {
    
    
            n=n/prime[i];
            if(n%prime[i]==0)
            {
    
    
                return 0;
            }
        }
    }
    return 1;
}
int main()
{
    
    
    isprime();
    int t,flag,t1=1;
    cin>>t;
    while(t--)
    {
    
    
        cin>>n;
        flag=finsh();
        if(flag&&n>=MAX)
        {
    
    
          LL s = (LL)(sqrt((double)n));
          if(s*s==n)
          {
    
    
              flag=0;
          }
        }
        printf("Case %d: ",t1++);
        if(flag)
        {
    
    
            cout<<"Yes"<<endl;
        }
        else
        {
    
    
            cout<<"No"<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mingjiweixiao/article/details/113814858
今日推荐