素数筛选法

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

 

posted @ 2016-03-28 23:04  我在这儿  阅读(280)  评论(0编辑  收藏  举报