【VC6.0】素数筛法获取全部素数(埃拉托斯特尼筛法)

具体筛法是:

先把n个自然数按次序排列起来。

1不是质数,也不是合数,要划去。

第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。

2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。

3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。

这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛法”,简称“筛法”。


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

int main(int argc, char * argv[])
{
    //寻找2~num之间的所有素数
    if(argc < 2)
    {
        printf("Usage : %s num\n", argv[0]);
        return 0;
    }
    int iMax = atoi(argv[1]);

    if(iMax < 2)
    {
        printf("num is too little, num >=2");
        return 0;
    }

    char *p = (char *)malloc(sizeof(char) * iMax + 1);
    memset(p, sizeof(char) * iMax + 1, 0);

    int i = 0, j = 0, k = 0;
    for(i = 2; i <= iMax; i++)
    {
        for(j = i + i; j <= iMax; j += i)
        {
            p[j] = 1;
        }
    }
    FILE * fp = NULL;
    //程序执行完成后,文件 prime-number.txt中就是我们需要的素数
    if((fp = fopen("prime-number.txt", "w")) == NULL)
    {
        return 0;
    }
    k = 0;
    int iAll = 0;
    for(i = 2; i <= iMax; i++)
    {
        if(0 == p[i])
        {
            iAll ++;
            k++;
            // output to file : fp,把这些素数写入文件
            fprintf(fp, "%6d ", i);
            if(10 == k)
            {
                fprintf(fp, "\n");
                k = 0;
            }
            //printf("%d ", i);
        }
    }
    printf("\n");
    fclose(fp);
    free(p);
    printf("all : %d\n", iAll);

    return 0;
}

作者:风波

mail : [email protected]

你可能感兴趣的:(C语言)