首页 > 其他分享 >最遥远的距离

最遥远的距离

时间:2022-09-24 21:47:42浏览次数:50  
标签:int 质数 memset sqrt 遥远 距离 sizeof

 

世界上最遥远的距离,并不是天与地

而是我站在你身后,看着你偷偷的划水。。。

现在有一个质数村,村子里住着许多质数,但它们的权值均在区间[L,R]之间

现在小J想知道这个区间内距离最接近的两个相邻的质数

如果存在相同距离的其他相邻质数对,则输出第一对。

例如5与7的距离为2,11与13的距离也为2,但前者更优先

同理,他还希望找出距离最远的。

如果找不到输出"Not find"

Format
Input
多组数据,请做到文件底结束

每行输入两个整数L和U,其中L和U的差值不会超过1000000

1≤L<U≤2^31−1

Output
对于每个L和U ,输出一个结果,结果占一行。

详见样例

Samples
输入数据 1
2 17
14 17
输出数据 1
2 3 7 11
Not find

 

Sol:类比下埃式筛法

发现我们要筛去的是[L,R]这一段的合数

而对于[1,R]这一段的所有合数,其较小的质因子均不超过sqrt(R)

于是找出所有小于等于sqrt(R)的质数,然后使用埃式筛法,去筛[L,R]这一段的合数。

在保存数组的时候,由于L,R均会很大,不能直接存在数组中,要进行数组下标的移动。

然后数据还是有构造的,有些小地方要注意,标记在程序中了。

#include<bits/stdc++.h>
using namespace std;
int a[1000000],b[1000000],c[1000005];
int main()
{
	    int l,r;
        cin>>l>>r;
        if(l==1)
           l++;
		int rr=sqrt(r);
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		for(int i=2;i<=rr;i++)
		{
			if(a[i]==0)
			{
				for(int j=i;j<=rr/i;j++)
				    a[j*i]=1;
				int len; //找到一个len,保证len*i>=左边界l 
				if (l%i==0)
				    len=l/i;
				else
				    len=l/i+1;
				for(int j=len;j<=r/i;j++)
				//注意当l等于i时,len的值为1.
				//而我们设定的j,为i的若干倍,所以j的值不能为1,而是要大于1 
				  if (j>1)
				      b[j*i-l]=1;
			}
		}
		int minl,minr,minc=1e9,maxl,maxr,maxx=0,m=0;
		for(int i=l;i<=r;i++)
		{
			if(b[i-l]==0)
			   {
			   c[++m]=i;
			   }
			if (i==r)
			//注意r的值可能为2147483647,所以此时就应该要跳出循环
			//否则再执行i++后,其值变为负数 
			    break;
		}
		if(m<=1) 
		{
			cout<<"Not find"<<endl;
			return 0;
		}
		for(int i=2;i<=m;i++)
		{
			if(c[i]-c[i-1]<minc)
			{
				minc=c[i]-c[i-1];
				minl=c[i-1];
				minr=c[i];
			}
			if(c[i]-c[i-1]>maxx)
			{
				maxx=c[i]-c[i-1];
				maxl=c[i-1];
				maxr=c[i];
			}
		}
		cout<<minl<<" "<<minr<<" "<<maxl<<" "<<maxr<<endl;
	
	return 0;
}

  

标签:int,质数,memset,sqrt,遥远,距离,sizeof
From: https://www.cnblogs.com/cutemush/p/16726726.html

相关文章