您的位置:首页 > 其它

素数筛选法

2016-03-28 23:04 435 查看
筛选法(埃拉托色尼(Eratosthenes)筛法)求素数,例如1~100

思想:逐个筛选,直到int(sqrt(100))个

1)因为1不是质数,将1筛去

2)2是质数,将2的倍数全都挖掉

3)3是质数,将3的倍数全都挖掉

4)4已经被挖去,不进行与4相关的操作

5)5是质数,将5的倍数全都挖掉

6)这个过程一直进行到后面的数全都挖掉为止

不是从1开始:如10~18----一个一个筛--->18

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
//#include <string.h>
int isprime(int n)
{
int i;
if(n == 1)
return 0;
for(i=2;i<(int)sqrt(n);i++)
if(n%i == 0)
return 0;
return 1;
}
int main()
{
int n,i,j;
scanf("%d",&n);
int *num = (int*)malloc(sizeof(int)*(n+1));
//memset(num,0,n+1);//不能将动态开辟的数组数都初始化为0
for(i=1;i<=n;i++)
num[i] = 0;
//挖数
num[1] = 1;
for(i=2;i<=(int)sqrt(n);i++)
{
if(!num[i])
{
if(isprime(i))
{
for(j=2*i;j<=n;j++)    //挖掉质数的倍数的数
if(j%i == 0)
num[j] = 1;
}
}
}
for(i=1;i<=n;i++)
if(!num[i])
printf("%d ",i);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: