SGU 113. Nearly prime numbers 素数

来源:互联网 发布:2017网络歌曲 编辑:程序博客网 时间:2024/06/05 08:08

                  m*n=p并且m,n都是素数,那么一定是m,n一个比sqrt(p)大,一个比sqrt(p)小,或者m==n==sqrt(p),所以构造素数表时判断到sqrt(10^9)即可。


#include<cstdio>#include<iostream>#include<set>using namespace std;int isprime(int n){    for(int i=2; i*i<=n; i++)        if(n%i==0)  return 0;    return 1;}set<int>st;int prime[4210],count=0;int main(){    int maxx=0;    prime[count++]=2;    prime[count++]=3;    st.insert(2);    st.insert(3);    for(int i=4; i<=40000; i++)    {        if(isprime(i))        {            prime[count++]=i;            st.insert(i);            maxx=max(maxx,i);        }    }    int n,p;    cin>>n;    while(n--)    {        cin>>p;        for(int i=0; i<count; i++)        {            if(prime[i]*prime[i]>p)            {                cout<<"No"<<endl;                break;            }            else if(p%prime[i]==0)            {                int a=p/prime[i];                if(st.count(a)||(a>maxx&&isprime(a)))                {                    cout<<"Yes\n";                    break;                }            }        }    }    return 0;}


原创粉丝点击