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