埃式筛法
2016-08-12 21:55
323 查看
埃氏筛或爱氏筛,是一种公元前250年由古希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去。见下图:
一、利用埃式筛法打印质数:
首先是自己写的,一点都不优雅:
接着是网上大神写的,看似不同,实际上意思差不多(出处:http://blog.csdn.net/a2459956664/article/details/51099055):
二、利用埃式筛法打印n的约数个数
其实与打印质数区别不大,唯一的不同之处就是筛选之后到底要剩下什么。看代码就能理解了:
一、利用埃式筛法打印质数:
首先是自己写的,一点都不优雅:
#include <stdio.h> #include <string.h> using namespace std; const int max=1000001; int prime[max]; bool isprime[max]; int Prime(int n){ memset(isprime,true,sizeof(isprime)); int p=0; isprime[0]=isprime[1]=false; for(int i=2;i<=(n >> 1);i++){ for(int j=2;j*i<=n;j++) isprime[i*j]=false; } for(int i=2;i<=n;i++) if(isprime[i]) prime[p++]=i; return p; } int main(){ int n; while(scanf("%d",&n) && n){ int number=Prime(n); printf("Prime Number is %d\n",number); for(int i=0;i<number;i++) printf("%d\n",prime[i]); } }
接着是网上大神写的,看似不同,实际上意思差不多(出处:http://blog.csdn.net/a2459956664/article/details/51099055):
#include <cstdio> using namespace std; const int maxn = 1000000 + 10; int prime[maxn]; //第i个素数 bool is_prime[maxn]; //is_prime[i]为true表示i是素数 //返回n以内的素数的个数 int sieve(int n) { int p = 0; for (int i = 0; i <= n; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for (int i = 2; i <= n; i++){ if (is_prime[i]){ prime[p++] = i; for (int j = 2 * i; j <= n; j += i) is_prime[j] = false; } } return p; } int main() { int n; while (scanf("%d", &n) != EOF){ printf("%d\n", sieve(n)); } return 0; }
二、利用埃式筛法打印n的约数个数
其实与打印质数区别不大,唯一的不同之处就是筛选之后到底要剩下什么。看代码就能理解了:
#include <stdio.h> #include <algorithm> using namespace std; const int Max=1000001; int fac[Max]={0,1}; void factorNumber(){ fill(fac+2,fac+Max,2); for(int i=2;i<=(Max<<1);i++) for(int j=2;i*j<=Max;j++) ++fac[i*j]; } int main(){ int n; factorNumber(); while(scanf("%d",&n) && n) printf("%d\n",fac ); }
相关文章推荐
- 埃式筛法
- TOJ 3105.A Way To Find Primes(埃式筛法)
- TOJ 3259.Mysterious Number(埃式筛法)
- 【算法-简单数学问题】- 素数表的获取(简单方法和埃式筛法)
- 埃式筛法计算素数Python3(学了一阵儿了,第一次写.)
- 埃式筛法(素数筛) + 区间素数筛 + 应用
- 素数筛(埃式筛法/欧拉筛法)
- (扩展)欧几里得算法、素性测试、埃式筛法、区间筛法、快速幂运算
- toj3259[Mysterious Numbers]埃式筛法
- G-Prime Generator|埃式筛法
- 埃式筛法——快速筛选n以内的素数
- TOJ 1868.Count the factors(埃式筛法)
- poj3126 埃式筛法+bfs
- 【埃式筛法】My pretty girl Noora CodeForces - 822D
- 埃式筛法模板及其改进
- 埃式筛法
- 判断素数 筛法
- 我的第一个程序:Java筛法求质数
- C/C++查找一定范围内的素数(筛法)
- 【线性筛法求解积性函数】Archer