论《素数的几种筛法》

第一种 试除法

每一个除一除,试一试就好了

bool prime(int n){ 
	if(n<2)
		return false;
	for(int i=2;i<=n;i++){
		if(n%i==0)
			return false;
	}
	return true;
}

    这个都会,不说了

    优化:其实只用枚举至sqrt(n),就可以省掉一些时间

    bool prime(int n){ 
    	if(n<2)
    	    	return false;
    	for(int i=2;i*i<=n;i++){
    		if(n%i==0)
    		    	return false;
    	}
    	return true;
    }
    
    

      优点:通俗易懂(在本题库能解决大部分素数)
      缺点:很慢(请看后面)

      第二种 埃筛

      原理:写下2~n数字,先找出第一个数,将其倍数划去,再找新一个未被划去的数,再将其倍数划去,重复此步骤,最后得到的是素数

      int primes[n],cnt;
      bool v[n];
      void aishai(int n){
      	for(int i=2;i<=n;i++){
      		if(v[i]) continue;
      		primes[cnt++]=i;
      		for(int j=i+1;j<=n;j+=i)
      			v[j]=true;
      	}
      }

        优点:可以快速筛出大量质数,可应对大量素数题目

        第三种:线性筛(埃筛优化版)

        这个不用说了,看代码:

        int primes[n],cnt;
        bool v[n];
        void xianxingshai(int n){
        	for(int i=2;i<=n;i++){
        		if(!v[i]) primes[cnt++]=i;
        		for(int j=0;i*primes[j]<=n;j++){
        			v[primes[j]*i]=true;
        			if(i%primes[j]==0) break;
        		}
        	}
        }

        优点:可应对绝大多数素数题目,很快

        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

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

        抵扣说明:

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

        余额充值