poj——2689(数论之素数筛法)

题目地址:http://poj.org/problem?id=2689

解析:直接把sqrt(22*10e8)以内的素数筛选出并保存下来,然后对L——u内的数进行筛选,剩下的就是素数了。

#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define INF 0x7fffffff
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define N 101
int flag[50000];
ll prime[10000];
ll sign[1000005];
int q=0;
void init()
{
    ll i,j;
	for(i=2;i*i<=50000;i++)
	 {
 		if(flag[i]) continue; 
 		prime[q++]=i;
 		for(j=i*i;j<50000;j+=i)
 		 flag[j]=1;
 	}
 	for(i;i<50000;i++) 
 	  if(!flag[i]) prime[q++]=i;
}
ll g[200000];
int main()
{
	ll i,j,k,t;
	ll m,n;
	ll a,b;  
	ll p;
	init();
	while(cin>>a>>b)
	 {
	 	memset(sign,0,sizeof(sign));
	 	p=0;	 	
 		for(j=0;j<q;j++)
		   {
		   	k=a/prime[j];
		   	while(k*prime[j]<a||k<=1) k++;
		   for(ll l=k*prime[j];l<=b;l+=prime[j])   //用ll以免越界
		   {
		   	if(l>=a) sign[l-a]=1;
		   } 
		   }
                if(a==1) sign[0]=1;   //1的特殊情况
	 	for(i=a;i<=b;i++)
	 	{
	 		if(!sign[i-a]) g[p++]=i;
	 	}
	 	if(p<=1) 
		 {
		 cout<<"There are no adjacent primes."<<endl;
		 continue;
		 }
		 ll Min=INF;
		 ll Max=-INF;
		 ll stx,sty,edx,edy;
	 	 for(i=1;i<p;i++)	
	 	  {
	 	  	ll mid=g[i]-g[i-1];
  	 		if(Min>mid) 
			   {
			   Min=mid;
			   stx=g[i-1];
			   sty=g[i];
			   }
  	 	    if(Max<mid) 
			   {
			   Max=mid;
			   edx=g[i-1];
			   edy=g[i];
			   }
  	 	  }
 	    cout<<stx<<","<<sty<<" are closest, "<<edx<<","<<edy<<" are most distant."<<endl;
 	 }	
	return 0;
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值