数据结构作业-素数区间

素数区间

★实验任务
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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值