码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉筛/线性筛,埃氏筛和普通方法的区别

时间:2021-05-24 15:57:51      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:scan   math   print   运算   等于   约数   prime   解释   sizeof   

质数是什么,先来随便补补(其实直接跳过就好)~~作为一个聪明人,肯定buhui用自己的话来解释~~

        “质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。最小的质数是2,它也是唯一的偶数质数。最前面的质数依次排列为:2,3,5,7,11等。比1大但不是质数的数称为合数。”
    
        www.videoc.cn


###    想直接入正文往下滑
普通筛法:
    方法:从1-n上,逐个判断每个数字是否是质数,是质数就输出
    

//判断函数
int judge(int n)
{
    int flag=1;//先默认是质数
    for(int i=2;i<n;i++)//注意i初始值是2,要一直到n-1
        if(n%i==0)
            flag=0;//如果有一个i是n的约数,n就不是质数
    if(flag)
        printf("%d ",n);
}

 



时间测试:2-100------>>>1.647400ms
         2-1000----->>>6.647100ms
         2-10000---->>>>171.312900ms
         2-100000--->>>>12236.700000ms

```
高效+1:利用求根sqrt(n)来减少n需要判断的因数i。

> 为毛可以这样:(会的立刻下滑),因为对于非质数,至少存在一对因数,其中小因数必然小于等于sqrt(n),另一个必然大于等于,例如36,客官你品,你仔细

好了,只需要

int judge(int n)
{
    int flag=1;//先默认是质数
    for(int i=2;i<=sqrt(n);i++)//sqrt在math.h头文件内
        if(n%i==0)
            flag=0;//如果有一个i是n的约数,n就不是质数
    if(flag)
        printf("%d ",n);
}

 




现在开始高效++
埃氏筛:
原理:
首先剔除1,剔除2的倍数,3的倍数,5的倍数,7的倍数,依次类推,然后可能减少很大的运算量

#include<stdio.h>
 long long is_prime[100000000];
int sieve(int n,int m)//埃氏筛法
{
    long long i,j,count=0;
    for(i=2;i<=m;i++)
    {
        is_prime[i]=1;
    }
    is_prime[0]=is_prime[1]=0;//0和1都不是素数
    for(i=2;i<=m;i++)
    {
        if(is_prime[i])
        {
            if(i>=n&&i<=m)
            {
            printf("%d\n",i);//将区间[n,m]之间的素数输出*/
            count++;
            }
            for(j=2;j*i<=m;j++)
                is_prime[j*i]=0;
        }
    }
    return count;
}
int main()
{
    long long n,m;
    scanf("%d%d",&n,&m);
    printf("有%d个素数",sieve(n,m));//输出个数
    return 0;
}

 




欧拉筛/线性筛:
原理;合数能由其他数的相乘得到,所以若一个数能由其他数相乘得到,那么它一定不是质数。

#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] ==t rue) printf("%d\n",i);
    return 0;
}

 





这么幸苦点个??吧

欧拉筛/线性筛,埃氏筛和普通方法的区别

标签:scan   math   print   运算   等于   约数   prime   解释   sizeof   

原文地址:https://www.cnblogs.com/gaozexun/p/14783959.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!