您的位置:首页 > 其它

埃式筛法

2016-08-12 21:55 323 查看
埃氏筛或爱氏筛,是一种公元前250年由古希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去。见下图:



一、利用埃式筛法打印质数:

首先是自己写的,一点都不优雅:

#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
);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论 算法 埃式筛法