筛选区间素数模板(poj2689)

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cstring>
  6. using namespace std;
  7. const int maxn = 100000 + 10;
  8. int prime[maxn+1];
  9. void getprime()
  10. {
  11.     memset(prime, 0, sizeof(prime));
  12.     for (int i = 2; i <= maxn; i++)
  13.     {
  14.         if (!prime[i])prime[++prime[0]] = i;
  15.         for (int j = 1; j <= prime[0] && prime[j] <= maxn / i; j++)
  16.         {
  17.             prime[prime[j] * i] = 1;//标记不是素数
  18.             if (i%prime[j] == 0)break;
  19.         }
  20.     }
  21. }
  22. bool notprime[1000000 + 10];
  23. int prime2[1000000 + 10];
  24. void getprime2(int L, int R)//筛选[L,R]区间的素数
  25. {
  26.     memset(notprime, false, sizeof(notprime));
  27.     if (L < 2)L = 2;
  28.     for (int i = 1; i <= prime[0] && (long long)prime[i] * prime[i] <= R; i++)
  29.     {
  30.         int s = L / prime[i] + (L % prime[i] > 0);//(s==prime[i]-1||s==prime[i])
  31.         if (s == 1)s = 2;//s==1说明除尽 L本身不是素数所有从2开始累乘
  32.         for (int j = s; (long long)j*prime[i] <= R; j++)
  33.         {
  34.             if ((long long)j*prime[i] >= L) {
  35.                 notprime[j*prime[i]-L] = true;//不是素数
  36.             }
  37.         }
  38.     }
  39.     prime2[0] = 0;//prime[0]用来存放素数的个数
  40.     for (int i = 0; i <= R - L; i++) {
  41.         if (!notprime[i]) {
  42.             prime2[++prime2[0]] = i + L;//计数和向后打表
  43.         }
  44.     }
  45. }
  46. int main()
  47. {
  48.     getprime();
  49.     int L, R;
  50.     while (scanf("%d%d", &L, &R) == 2)
  51.     {
  52.         getprime2(L, R);
  53.         if (prime2[0] < 2)printf("There are no adjacent primes.\n");
  54.         else
  55.         {
  56.             int x1 = 0, x2 = 100000000, y1 = 0, y2 = 0;
  57.             for (int i = 1; i < prime2[0]; i++)
  58.             {
  59.                 if (prime2[i + 1] - prime2[i] < x2 - x1) {
  60.                     x1 = prime2[i]; x2 = prime2[i + 1];
  61.                 }
  62.                 if (prime2[i + 1] - prime2[i] > y2 - y1) {
  63.                     y1 = prime2[i]; y2 = prime2[i + 1];
  64.                 }
  65.             }
  66.             printf("%d,%d are closest, %d,%d are most distant.\n", x1, x2, y1, y2);
  67.         }
  68.     }
  69.     return 0;
  70. }

 

单纯记录一下这种素数打表的想法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值