Advertisement

【素数筛】质数距离

阅读量:

小目录

    • 链接
    • 题目描述
    • 思路
    • 代码

链接

YbtOJ 6-2-2

题目描述

给定两个整数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)

还没有任何评论哟~