标签: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