《ACM程序设计》-Problem-R-半素数问题

题意:

Description

主数字定义
如果大于1的整数只有正的除数(因子)为1,则称为质数。例如,2,11,67,89是素数,但8,20,27不是。

半优先数定义
如果一个大于1的整数可以被分解为两个质数,则称之为半质数。例如,6是半质数,但12不是。

您的任务只是确定给定的数字是否是半质数。

Input

在输入中有几个测试用例。每种情况包含单个整数N(2≤N≤1,000,000)

Output

每行一个整数。如果数字是半质数,则输出“是”,否则输出“否”。

Sample Input

3
4
6
12

Sample Output

No 
Yes 
Yes 
No 

解题思路:刚开始很少zz的用最普通的找素数方法做,然后写完以后运行发现半天黑屏出不来结果,然后才突然想起来数据太大运行时间太长即使代码没问题也要超时的,于是上网搜索筛素数方法,研究了一下确实很厉害那么大的数据也能很快运行出来,然后一定范围内的素数全部求出来以后再相互乘积存到set容器里面,这样直接检索有没有相应的数就可以了否则再用普通的查找方法还是要超时的。

代码如下:

#include
using namespace std;
const int n=1000000;
bool a[1000005];
long int b[1000005],h;
sete;
int main()
{   int i,j,k,l=0,r,w;
    a[0]=a[1]=0;a[2]=1;
    for(i=3;i         a[i]=i%2==0?0:1;
    k=(int)sqrt(n*1.0);
    for(i=3;i<=k;i++)
        if(a[i]==1)
        for(j=i*i;j         a[j]=0;
    for(i=0;i         if(a[i]==1)
        b[l++]=i;
     for(i=0;i      for(int q=0;q      if(b[i]*b[q]         e.insert(b[i]*b[q]);
     else
        break;
    set::iterator it;
     while(cin>>w)
    {    it=e.find(w);
        if(it!=e.end())
            cout<<"Yes"<         else
            cout<<"No"<

    }


  return 0;
}

回顾:大数据问题要先考虑什么方法适合否则做不出来的,数据运行时间太长了。






你可能感兴趣的:(作业)