zoj 2723 Semi-Prime(素筛打表+搜索优化)

题目链接:

  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2723

题目描述:

Prime Number Definition
An integer greater than one is called a prime number if its only positive divisors (factors) are one and itself. For instance, 2, 11, 67, 89 are prime numbers but 8, 20, 27 are not.

Semi-Prime Number Definition
An integer greater than one is called a semi-prime number if it can be decompounded to TWO prime numbers. For example, 6 is a semi-prime number but 12 is not.

Your task is just to determinate whether a given number is a semi-prime number.

Input

There are several test cases in the input. Each case contains a single integer N (2 <= N <= 1,000,000)

Output

One line with a single integer for each case. If the number is a semi-prime number, then output "Yes", otherwise "No".

Sample Input

3
4
6
12

Sample Output

No
Yes
Yes
No

 1 /*问题 判断输入的n(n的范围是2到100 0000)是否为半素数
 2 解题思路 先用素筛法建立一张[2,50 0000]的素数表放在数组里,再将素数存进向量里,然后计算出2到100 0000的半素
 3 数表放在set集合里后查表即可*/
 4 #include <cstdio>
 5 #include <set>
 6 #include <cmath>
 7 #include <vector>
 8 using namespace std;
 9 
10 int isPrim[500010];
11 
12 void prim(int n);
13 
14 int main()
15 {
16     prim(500000);
17     
18     vector<int> prim_vec;//对于未知大小的数据来说非常方便 
19     int i;
20     for(i=2;i<=500000;i++){
21         if(isPrim[i])
22             prim_vec.push_back(i);
23     }
24     
25     set<int> prim_set;//查询起来非常快速、方便 
26     int j,p;
27     for(i=0;i<prim_vec.size();i++){
28         for(j=0;j<prim_vec.size();j++){
29             if( (p = prim_vec[i]*prim_vec[j]) <=1000000)
30                 prim_set.insert(p);    
31             else
32                 break;//一种优化方法,对于有顺序的数据 
33         }
34     }
35     
36     int n;
37     set<int>::iterator it; 
38     while(scanf("%d",&n) != EOF)
39     {
40         it=prim_set.find(n);
41         if(it != prim_set.end())
42             printf("Yes\n");
43         else
44             printf("No\n");
45     }
46     return 0;    
47 } 
48 
49 void prim(int n)
50 {
51     int i,j,k;
52     
53     for(i=0;i<=n;i++)
54         isPrim[i]=1;//全部初始化为1,假定全是素数 
55     isPrim[0]=isPrim[1]=0;//0和1非素数
56      
57     k=(int)sqrt(n);
58     for(i=2;i<=k;i++){
59         if(isPrim[i]){
60             for(j=2*i;j<=n;j+=i)
61                 isPrim[j]=0;
62         }
63     }
64     /*
65     int count=0;
66     for(i=2;i<=n;i++){
67         if(isPrim[i])
68             count++;//记录50 0000以内的素数有41538个,验证素筛写的对不对 
69     }
70     printf("%d\n",count);
71     */
72 }

 

posted @ 2018-03-11 11:58  Reqaw  阅读(318)  评论(0编辑  收藏  举报