素数区间
★实验任务
dark di在做数学题目的时候发现了一个现象,2个相邻的素数之间存在一个区间,他把这个区间称为非素数区间,那么dark di想知道,给定一个正整数x,x所在的非素数区间长度是多少呢? 例如23和29是2个相邻的素数,他们之间的非素数区间是[24,28],长度是5,假设x=27,那么x所在的非素数区间长度就是5。如果x是一个素数,则答案是0。注意:素数指的是除了1和它本身以外不再有其他因数的自然数。
★输入格式 第一行输入一个正整数T,表示接下去有T次询问。
接下去T行,每行一个正整数x。(2<=x<=100000)。
对于30%的数据,T<=5,2<=x<=100
对于80%的数据,T<=10,2<=x<=5000
对于100%的数据,T<=100000,2<=x<=100000
★输出格式 输入T行,每行一个整数表示非素数区间的长度。
知识点
该题涉及到素数筛选 和 二分法查找
欧拉筛
对于二重循环 暴力找素数 复杂度应该为 O(n**2)
对于埃是。埃氏筛法O(nloglogn)
埃氏筛法:从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的
至于为什么是 O(nloglogn) 表示我又不是数学系 我脑子有病去推他
欧拉筛法:在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的
#include<stdio.h>
#include<stdbool.h>
int main(void){
int n,count=0;
scanf("%d",&n);
bool number[n+1];
int prime[n+1];
memset(number,true,sizeof(number));
for(int i=2;i<=n;i++){
if(number[i]) prime[count++]=i;
for(int j=0;j<count&&prime[j]*i<=n;j++){
number[prime[j]*i]=false;
if(i%prime[j]==0) break;
}
}
for(int i=2;i<n+1;i++)
if(number[i]==true) printf("%d\n",i);
return 0;
}