素数筛选法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数筛选法相关的知识,希望对你有一定的参考价值。

筛选法(埃拉托色尼(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;
}

 

以上是关于素数筛选法的主要内容,如果未能解决你的问题,请参考以下文章

如何提高筛选法求大范围素数的效率

素数筛选法

c语言中用筛选法求素数

素数筛选法

数论——素数筛选法与整数的素因子分解

埃拉托色尼筛选法求素数