【素数筛】质数距离
发布时间
阅读量:
阅读量
小目录
-
- 链接
- 题目描述
- 思路
- 代码
链接
题目描述
给定两个整数L,R,求闭区间[L,R]中相邻两个质数的差最大以及最小是多少,输出这两个质数。
思路
L - R很小,但是L,R很大,所以我们可以求到根号下R的大小,然后再在线求就好了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
int ans_max, ans_min, ans_max1, ans_max2, ans_min1, ans_min2;
int numm, l, r, num, a[30000005], p[3000005], u[3000005];
int main() {
int t = 2147483647;
int n = sqrt(t);
a[0] = a[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!a[i])
p[++num] = i;
for (int j = 1; j <= num && i * p[j] <= n; ++j) {
a[p[j] * i] = 1;
if (i % p[j] == 0)
break;
}
}
while (scanf("%d%d", &l, &r) != EOF) {
memset(a, 0, sizeof(a));
numm = 0;
if(l == 1) l++;
for(int i = 1; i <= num; ++i)
for(int j = (l - 1) / p[i] + 1; j <= r / p[i]; ++j)
if(j > 1)
a[j * p[i] - l] = 1;
for(ll res = l; res <= r; ++res)
if(!a[res - l]) u[++numm] = res;
if(numm < 2)
printf("There are no adjacent primes.\n");
else {
ans_min1 = ans_max1 = u[1];
ans_max2= ans_min2 = u[2];
ans_max = ans_min = u[2] - u[1];
for(int i = 3; i <= numm; ++i) {
if(ans_max < u[i] - u[i - 1]) {
ans_max = max(ans_max, u[i] - u[i - 1]);
ans_max1 = u[i - 1];
ans_max2 = u[i];
}
if(ans_min > u[i] - u[i - 1]) {
ans_min = min(ans_min, u[i] - u[i - 1]);
ans_min1 = u[i - 1];
ans_min2 = u[i];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n", ans_min1, ans_min2, ans_max1, ans_max2);
}
}
}
全部评论 (0)
还没有任何评论哟~
