QDU-GZS与素数大法(素数筛法)

Description

 

自从GZS成为G神之后,追随者不计其数,更是有了大名鼎鼎的拜神论:

"吾尝终日编程也,不如须臾之拜拜G神也;吾尝打字刷题也,不如一日三拜G神也;

拜拜G神,程序非长也,而出结果;三拜G神,打字非快也,而能AC。

吾日三拜G神也!!!“

作为菜鸟,经常遇到一些难题,于是就去拜见G神了。G神一看题目,微微一笑说道:“这种水题也算难题?我闭着眼都能一分钟刷十道!”毕竟是G神,我等菜鸟还是得虚心向G神学习。各位大神们,相信这道水题你们也能很快就AC吧。题目是这样的:

 

给定一个范围[l,r],求[l, r]中的距离最近的两个相邻素数和距离最远的两个相邻素数。

Input

 

多组测试数据,每组数据一行,包含两个数字l和r。1<=l<=r<=5*10^6。

Output

 

如果存在,则按样例格式输出最近的两个素数和最远的两个素数(如果有多个,输出最小的);如果不存在,输出一行:There are no adjacent primes.

Sample Input 1 

2 17
14 17

Sample Output 1

2,3 are closest, 7,11 are most distant.
There are no adjacent primes.

Source

qduoj 第一次月赛 for 2014级

思路:用欧拉筛法先筛出素数,然后遍历两次找出最大的和最小的,注意1既不是素数也不是合数

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>

using namespace std;
int prime[5000005];
bool vis[5000006];
void oula() {
	int cnt=0;
	memset(prime,0,sizeof(prime));
	memset(vis,false,sizeof(vis));
	for(int t=2; t<=5000005; t++) {
		if(!vis[t])
			prime[cnt++]=t;
		for(int j=0; j<cnt&&t*prime[j]<=5000005; j++) {
			vis[t*prime[j]]=true;
			if(t%prime[j]==0)
				break;
		}
	}
}

int a[5000005];
int b[5000005];

int main()
{
	
	int l,r;
	int k;
	int k2;
	oula();
	vis[1]=true;
	while(cin>>l>>r)
	{
		k=0;
		k2=0;
		for(int t=l;t<=r;t++)
		{
			if(vis[t]==false)
		    {
			a[k++]=t;
		    }
		    
	    }
	   
	    for(int t=1;t<k;t++)
	    {
	         b[k2++]=a[t]-a[t-1];	
		}
		sort(b,b+k2);
		int s1,s2,s3,s4;
		for(int t=1;t<k;t++)
		{
			if(a[t]-a[t-1]==b[0])
			{
				s1=a[t-1];
				s2=a[t];
				break;
			}
		}
		for(int t=1;t<k;t++)
		{
			if(a[t]-a[t-1]==b[k2-1])
			{
				s3=a[t-1];
				s4=a[t];
				break;
			}
		}
		if(k>1)
		cout<<s1<<","<<s2<<" are closest, "<<s3<<","<<s4<<" are most distant."<<endl;
		else
		{
			cout<<"There are no adjacent primes."<<endl;
		}
	}
	
	
	return 0;
 } 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

black-hole6

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值