埃拉托斯特尼(公元前276—公元前194)ios
埃拉托斯特尼是古希腊著名的数学家、地理学家、天文学家。他先在亚历山大港学习,后又转至雅典。公元前236年,托勒密三世指定他为亚历山大图书馆的图书管理员和馆长。他跟阿基米德是好朋友。埃拉托斯特尼的主要贡献包括:算法
埃拉托斯特尼筛法:寻找素数的方法。学习
地理常数测量:日地间距的测量(如今称一个这样的距离为一个天文单位)、地月间距的测量、测量赤道与黄道之间的偏角、地球半径测量等。spa
精确地图绘制:当时只有托勒密等级的人物能绘出同等级的地图。code
算法数学原理:
埃拉托斯特尼筛法是快速筛选素数的算法,在处理大量整数是不是素数时有较高的效率。blog
例:筛选小于n的整数并记录结果。数学
解:计算sqrt(n),∵对于任意的z<n,若z为合数,不妨设z=a*b,则必有min(a,b)<sqrt(n)string
∴全部小于n的合数都可被小于sqrt(n)的整数整除it
从2开始,依次去除小于n的整数中能被其整除的数,最后剩下的就是素数io
int prime[maxn]; 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; }
例题:洛谷 P1865 ,
codevs3223 素数密度
[a,b]的素数,只须要
[2,b√]
的素数表便可。这样咱们能够筛出这些素数,而后用这些素数筛[a,b]。
注意,j=max(2ll,(l+i-1)/i)*i的意思:
(l+i-1)/i表示大于等于a的i的倍数的最小值。
2则是广泛的i的倍数的最小值,必定不能小于2。
再乘i,j就能够枚举[a,b]之间的合数了。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int SIZE=1000010; bool vis[SIZE]; bool pri[SIZE]; typedef long long LL; int main() { LL l,r; scanf("%lld%lld",&l,&r); for(LL i=2;i<=sqrt(r);i++) { if(!vis[i]) { for(LL j=i*i;j<=sqrt(r);j+=i) vis[j]=1; for(LL j=max(2ll,(l+i-1)/i)*i;j<=r;j+=i) pri[j-l]=1; } } int ans=0; for(int i=0;i<=r-l;i++) if(!pri[i]) ans++; printf("%d",ans); return 0; }