C++素数距离

素数距离

题目描述
素数是指除了1和它本身不能被其他数整除的数。第一个素数是2,紧接着的几个素数是3,5,7,但是后面素数的出现的频率就没有那么高了。

相邻素数是指两个数都是素数,而且这两个素数之间没有其他的素数,例如2和3不仅仅是相邻素数还是相邻的两个数。

编写一个程序,给定两个数字L和U,在这个范围内找到两个距离最近的相邻素数A和B(即B-A是最小的),你还需要找到另外两个相邻素数C和D,使得C和D的距离尽可能的大(即D-C是最大的)。如果存在相同距离的其他对,使用第一对,其中1≤L<R≤2^31-1,L ≤ A<B ≤ R,L ≤ C<D ≤ R。

输入格式
包含多组测试数据,每组数据一行,包含两个正整数L和R,L<R,L和R之间的差值不能超过1000000

输出格式
对于输入的每组L和R,分别输出最近的一对相邻素数和最远的一对相邻素数,输出格式参考输出样例。如果不存在相邻素数(因为L和R之间可能没有两个素数),输出:“There are no adjacent primes.”

输入输出样列
输入样例1:
2 17
14 17
输出样例1:
2,3 are closest, 7,11 are most distant.
There are no adjacent primes.
【耗时限制】2000ms 【内存限制】128MB

思路:
首先注意一下这道题的时间复杂度是2000ms,所以数据范围可能有些大,很容易超时。且必须使用scanf或printf读取或输出。
并且这道题的数据个数是2^31-1,远远超出了数组定义的范围,所以题目给了一个条件,即L和R之间的差值不能超过1000000。所以我们这道题需考虑动态数组。
方案一:原始方法,暴力枚举。
【枚举】枚举【L,R】中的每一个数x,判断x是否为质数,如果是,计算x和上一个质数的差值。时间复杂度O(T*(R-L)*√R)肯定超时!!!
TLE代码:

那该怎么办呢?

我又看了一遍题目,脑子里突然想到了以前老师给我们讲的另一种判断素数的方法:埃式筛法
埃式筛法:是埃拉托斯尼筛发的简称,是由希腊数学家埃拉托斯尼提出的一种素数的判定方法。
算法思想:质数的倍数必然不是质数。
时间复杂度:O(nlog(n))。
埃式筛法核心代码:

#include<cstdio>
using namespace std;

const int N=1e7+5;
int n;
bool del[N];
bool solve(int n){
   
	for(int i=2;i*i<=n;i++){
   
		if(!del[i]){
   
			for(int j=i;j<=n/i;j++)
				del[i*j]=true;
		}
	}
}
int main()
{
   
	scanf("%d",&n);
	solve(n);
	for(int i=2;i<=n;i++){
   
		if(!del[i])printf("%d\n",i);
	}
	return 0;
}

知道了爱是筛法后,我们就可以写出如下方案。
方案二:埃式筛法。
代码:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值