找小于某一整数内的素数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

/*
 * 求n以内的素数,并打印,反回素数的个数
 * 主要算法为筛法
 * 主要思想是: 素数的除1以外的倍数必然不是素数
 *             将所有素数的倍数全部都"筛掉",那剩下的必然都是素数
 */
int print_prim(int n);

/*
 * 求n以内的素数,并打印,反回素数的个数
 * 主要算法为除法
 * 主要思想是: 素数必然为除2以外的奇数,必然不可分解,如果一个数不是素数,那么它必然
 *             可分解为两个不包括1的整数的乘积,并且这两个数中至少有一个数小于
 *             这个数的开方根!
 */
int print_prim2(int n);

int main(int argc, char* argv[])
{
    int n = 100;
    if(argc == 2)
        n = atoi(argv[1]);
    print_prim(n);
    print_prim2(n);
    return 0;
}

//filter algrithom
int print_prim(int n)
{
    int next = 2;
    int i = next;
    int flag = 1;
    char* prim = (char*)malloc(n+1);//标志是否为素数
    memset(prim, 1, n);
    int t = 1;
    int m = 0; //用于统计效率
    while(next<=n)
    {
        //i*next 所有next的倍数必然不为素数,必然可分解为i*next
        for(i = next;(t=i*next)<=n;i++)
        {
            m++;
            prim[t] = 0;
        }
        next++;
        //找到下一个质数
        for(i = next; i < sqrt(n); i++)
        {
            m++;
            if(prim[i] == 1)
            {
                next = i;
                break;
            }
        }
    }
    int count = 0;
    for(i = 1; i < n; i+=2)
    {
        if(prim[i] == 1)
        {
            printf("%d, ", i);
            count ++;
        }
    }
    printf("\n"); 
    printf("filter efficiency = %d\n", m);
    return count;
}

int print_prim2(int n)
{
    int t;
    int i = 1;
    int m = 0; //用于统计效率
    int flag = 1;
    int count = 0;
    for(i = 1; i < n; i+=2)
    {
        flag = 1;
        int k = 2;
        t = sqrt(i);
        for(k = 2; k <= t; k++)
        {
            m++;
            if(i%k==0)
            {
                flag = 0;
                break;
            }
        }
        if(flag)
        {
            count ++;
            printf("%d, ", i);
        }
    }
    printf("\ndevide effeicency = %d\n", m);
    return count;
}

点赞