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

质数是什么,先来随便补补(其实直接跳过就好)作为一个聪明人,肯定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;
}



这么幸苦点个👍吧
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣高不会写Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值