zoukankan      html  css  js  c++  java
  • [学习笔记]线性筛素数

    线性筛素数指的是线性或者接近线性的方法,大多数指的是Eratosthenes筛法和欧拉筛

    当然,这里不讲一些神仙优化或特殊筛法(如(Miller Rabin)和素数必与(6)的倍数相邻)

    1、朴素筛法

    朴素筛法就是一一验证(1sim sqrt{n})之内的数判断,时间复杂度(O(nsqrt{n}))

    bool is_prime(int x){
    	if(x==1) return 0;
    	for(int i=2;i*i<=x;i++)
    		if(x%i==0)
    			return 0;
    	return 1;
    }
    

    2、Eratosthenes筛法

    其实就是找到一个素数,把其的倍数全部筛掉,时间复杂度(O(n log log n))

    题目传送门

    #include <bits/stdc++.h>
    using namespace std;
    int p[10000010];
    
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            p[i]=1;
        p[0]=p[1]=0;
        for(int i=2;i<=n;i++){
            if(p[i]==1){
                for(int j=i*2;j<=n;j+=i)
                    p[j]=0;
            }
        }
        for(int i=1;i<=m;i++){
            int t;
            scanf("%d",&t);
            if(p[t]==1) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
    

    3、欧拉筛

    欧拉筛就是找到了唯一筛掉一个数的筛法,所以时间复杂度是(O(n))

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=10000000+10;
    int n,m;
    int prime[maxn],cnt;
    char vis[maxn];
    inline int read(){
        register int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return (f==1)?x:-x;
    }
    
    int main()
    {
    	n=read(),m=read();
    	for(int i=2;i<=n;i++){
    		if(!vis[i]) prime[cnt++]=i;
    		for(int j=0;j<cnt&&i*prime[j]<=n;j++){
    			vis[i*prime[j]]=1;
    			if(i%prime[j]==0) break;
    		}
    	}
    	int val,l,r,mid;
    	while(m--){
    		val=read();
    		l=0,r=cnt-1;
    		while(l<r){
    			mid=(l+r)>>1;
    			if(val<=prime[mid]) r=mid;
    			else l=mid+1;
    		}
    		(prime[l]==val)?puts("Yes"):puts("No");
    	}
    	return 0;	
    } 
    
  • 相关阅读:
    String类的常用方法(P小写)
    二维数组:判断是否有目标数
    java实现输入年份判断在哪一天(正则表达式待改进)
    Java实现八进制正整数转化为十进制数
    时钟和定时器
    电路的频率响应---带宽的定义
    stm32两轮平衡车资料
    二阶常系数齐次线性微分方程的解法
    同步积分
    陀螺仪信号解调
  • 原文地址:https://www.cnblogs.com/owencodeisking/p/9717991.html
Copyright © 2011-2022 走看看