zoukankan      html  css  js  c++  java
  • poj 2689(素数)

    这道题是学习素数筛法的经典,应用到了区间筛素数。具体思路是先筛出1到sqrt(2147483647)之间的所有素数,然后再通过已经晒好素数筛出给定区间的素数。

    PS:如果用的int存low,high(输入)。注意high=2147483647.加1就变成负数了。

     1 // File Name: 2689.cpp
     2 // Author: Missa_Chen
     3 // Created Time: 2013年05月28日 星期二 23时16分51秒
     4 
     5 #include<iostream>
     6 #include<string>
     7 #include<algorithm>
     8 #include<cstdio>
     9 #include<cstring>
    10 #include<cmath>
    11 #include<queue>
    12 #include<map>
    13 #include<stack>
    14 #include<set>
    15 #include<cstdlib>
    16 
    17 using namespace std;
    18 
    19 #define LL long long
    20 const int inf = 0x3f3f3f3f;
    21 const int maxn = 1e6 + 5;
    22 int low, high;
    23 int prim[maxn], p[maxn], pn;
    24 void prime()
    25 {
    26     pn = 0;
    27     memset(p,0,sizeof(p));
    28     p[0] = p[1] = 1;
    29     for (int i = 2; i < maxn; ++i)
    30     {
    31         if (p[i]) continue;
    32         for (int j = i << 1; j < maxn; j += i)
    33             p[j] = 1;
    34         prim[pn++] = i;
    35     }
    36 }
    37 void prime2()
    38 {
    39     for (int i = 0; i < maxn; ++i) p[i] = 1;
    40     if (low == 1)
    41         p[0] = 0;
    42     for (int i = 0; i < pn; ++i)
    43     {
    44         if (prim[i] *(LL)prim[i] > high) break;
    45         LL st = low / prim[i];
    46         for (LL j = st * prim[i]; j <= high; j += prim[i])
    47         {
    48             if (j < low) continue;
    49             if (j == prim[i]) continue;
    50             p[j - low] = 0;
    51         }
    52     }
    53     int min_ans = inf, max_ans = -1, pre = -1;
    54     int res1,res2,res3,res4;
    55     for (int i = low; i <= high; ++i)
    56     {
    57         if (i < 0) break;//坑爹。以后还是用LL吧
    58         if (p[i - low])
    59         {
    60             if (pre == -1)
    61                 pre = i;
    62             else
    63             {
    64                 if (i - pre < min_ans)
    65                 {
    66                     min_ans = i - pre;
    67                     res1 = pre;
    68                     res2 = i;
    69                 }
    70                 if (i - pre > max_ans)
    71                 {
    72                     max_ans = i - pre;
    73                     res3 = pre;
    74                     res4 = i;
    75                 }
    76                 pre = i;
    77             }
    78         }
    79     }
    80     if (max_ans == -1)
    81     {
    82         printf("There are no adjacent primes.\n");
    83     }
    84     else
    85     {
    86         printf("%d,%d are closest, %d,%d are most distant.\n",res1,res2,res3,res4);
    87     }
    88 
    89 }
    90 int main()
    91 {
    92     prime();
    93     while (~scanf("%d%d",&low,&high))
    94     {
    95         prime2();
    96     }
    97     return 0;
    98 }
  • 相关阅读:
    搭建yum本地仓库
    VMware中安装Windows_Server_2008_R2
    2020.03.21 JOI春令营&A组 总结
    2020.03.18【NOIP提高组】模拟A 组 总结
    2020.03.14【NOIP提高组】模拟A 组 总结
    2020NOI在线能力测试【入门组】跑步
    价值备注
    Dockers 学习
    给网站配置免费的HTTS证书
    熟悉pyspider的装饰器
  • 原文地址:https://www.cnblogs.com/Missa/p/3105221.html
Copyright © 2011-2022 走看看