uva 10140 - Prime Distance

题意:给你一个L,U,求L到U中相邻最近的两个素数和相邻最远的两个素数,(1<=L<U<=2147483647) 即maxn = 2147483647 


素数筛选法预处理出sqrt(maxn)的素数表,对于给定的L,U,也是相当于筛选法,只需要把L,U范围内素数的倍数筛选掉就行


#include <stdio.h>
#define LL long long
bool vis[111111], vis1[1111111];
LL pri[111111];
LL max(LL a, LL b) {
	return a > b ? a : b;
}
int main() {
	int i;
	LL j;
	int num = 0;
	vis[1] = 1;
	for(i = 2;i*i <= 100000; i++) if(!vis[i])
		for(j = i*i;j <= 100000; j += i)
			vis[j] = 1;
	for(i = 2;i <= 100000; i++)	if(!vis[i])
		pri[num++] = i;
	LL l, r;
	while(scanf("%lld%lld", &l, &r) != -1) {
		LL len = r-l;
		for(i = 0;i <= len; i++)	vis1[i] = 0;
		for(i = 0;i < num && pri[i]*pri[i] <= r; i++) {
			LL now = max(l/pri[i]*pri[i], pri[i]*pri[i]);
			for(j = now;j <= r; j += pri[i])	if(j >= l)
				vis1[j - l] = 1;
		}
		if(l == 1)	vis1[0] = 1;
		int ans1 = 11111111, ans2 = 0, pre = 0, maxa, maxb, mina, minb;
		for(i = 0;i <= len; i++) {
			if(!vis1[i]) {
				if(pre) {
					if(i+l-pre < ans1)
						ans1 = i+l-pre, mina = pre, minb = i+l;
					if(i+l-pre > ans2)
						ans2 = i+l-pre, maxa = pre, maxb = i+l;
				}
				pre = i+l;
			}
		}
		if(ans2)
			printf("%d,%d are closest, %d,%d are most distant.\n", mina, minb, maxa, maxb);
		else
			puts("There are no adjacent primes.");
	}
	return 0;
}
// 2147400000 2147483647


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值