• 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
    ");
    43         else
    44             printf("No
    ");
    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
    ",count);
    71     */
    72 }
  • 相关阅读:
    【bzoj4152】[AMPPZ2014]The Captain 堆优化Dijkstra
    【bzoj4547】Hdu5171 小奇的集合 矩阵乘法
    【bzoj1264】[AHOI2006]基因匹配Match 树状数组
    【bzoj3856】Monster 乱搞
    【bzoj4724】[POI2017]Podzielno 二分
    【bzoj4976】宝石镶嵌 乱搞+dp
    【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra
    【bzoj4627】[BeiJing2016]回转寿司 离散化+树状数组
    【bzoj2124】等差子序列 STL-bitset
    【bzoj1996】[Hnoi2010]chorus 合唱队 区间dp
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8543728.html
Copyright © 2020-2023  润新知