找小于某一整数内的素数

来源:互联网 发布:paperpass 淘宝 编辑:程序博客网 时间:2024/05/17 01:55
#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 algrithomint 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;}

原创粉丝点击