素数II题解(素数筛)

题目描述

走进世博园某信息通信馆,参观者将获得前所未有的尖端互动体验,一场充满创想和喜悦的信息通信互动体验秀将以全新形式呈现,从观众踏入展馆的第一步起,就将与手持终端密不可分,人类未来梦想的惊喜从参观者的掌上展开。
在等候区的梦想花园中,参观者便开始了他们奇妙的体验之旅,等待中的游客可利用手机等终端参与互动小游戏,与梦想剧场内的虚拟人物Kr. Kong 进行猜数比赛。当屏幕出现一个整数X时,若你能比Kr. Kong更快的发出最接近它的素数答案,你将会获得一个意想不到的礼物。
例如:当屏幕出现22时,你的回答应是23;当屏幕出现8时,你的回答应是7;若X本身是素数,则回答X;若最接近X的素数有两个时,则回答大于它的素数。

输入

第一行,一个正整数 n,表示要竞猜的整数个数;
接下来的 n 行,每行一个正整数 X。

输出

输出有 n 行,每行一个整数,表示与对应 X 的最接近它的素数。

样例输入

4
22
5
18
8

样例输出

23
5
19
7
提示:对于 100%的数据:n<=1000000,X<=10000000。

素数筛处理出1e7内的所有素数,对筛出的素数进行处理,发现1e7内相邻2个素数之间的间隔不会超过200。若n是素数则输出本身,若n不是素数则向上下两个方向寻找,找到素数就直接输出。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
using namespace std;
int _,n,f[10000010];
int main(){
    
    
	f[1]=1;
	for(int i=2;i<=10000000;i++) if(!f[i])
		for(int j=2*i;j<=10000000;j+=i) f[j]=1;
	scanf("%d",&_);
	while(_--){
    
    
		scanf("%d",&n);
		if(!f[n]) printf("%d\n",n);
		else if(n&1)
			for(int i=2;i<=1000;i+=2){
    
    
				if(!f[n+i]&&n+i<=10000000){
    
    
					printf("%d\n",n+i);
					break;
				}
				else if(!f[n-i]&&n-i>=2){
    
    
					printf("%d\n",n-i);
					break;
				}
			}
		else
			for(int i=1;i<=1000;i+=2){
    
    
				if(!f[n+i]&&n+i<=10000000){
    
    
					printf("%d\n",n+i);
					break;
				}
				else if(!f[n-i]&&n-i>=2){
    
    
					printf("%d\n",n-i);
					break;
				}
			}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_50808324/article/details/112787778