质数的筛法--Eratosthenes筛法

题目来源于C和指针的编程练习。筛选出 2~某个上限数字之间的质数。

 

假设有数组num[100],num[0] = 2, num[1] = 3 ,依次类推。

先筛出能被2整除的数字,然后再次遍历数组筛出能被3整除的,接着是4,但是4已经被筛除,所以跳过,如此往复。

(后面还附上了一个普通的查询质数的代码)

题目要求将所有数组元素设置为TRUE(1),非质数则将其重新赋值为FALSE。 

 

因此我利用了数组下标作为计算的主题,然后查看该下标是否是质数,再通过对下标进行简单的运算,确定此次运算归属于哪个数组元素。

如果想要得知50000~51000,之间有多少个素数,可以通过修改SIZE ,在最后一段检测打印的部分,添加条件,I+2 > 50000 && i+2 < 51000,来获取当前区间的质数。

问题是,中间将面临很多的无用运算。

 

以下是代码,请指正

# include <stdio.h>

# define  SIZE 100
# define TRUE 1
# define FALSE 0

int main()
{
    int num[100];
    int* pt = &num[0];


    for (int i = 0; i < SIZE; i++)
        num[i] = TRUE;

    int base = 2;
    while ( pt<&num[SIZE])              //别写成 pt!=NULL .... 报错时就已经知道应该是数组越界的问题了,但是这个语句有点顺眼....
    {    
        if (*pt)    //检查当前元素是否已被筛除
        {
            for (int i = base; i < SIZE; i++)
            {
                if (!num[i - 1])      //同理,在进行筛选的过程中,跳过已被筛除的对象
                    continue;
                if ((i + 1) % base == 0)   
                    num[i-1] = FALSE;     
            }
        }

        base++;
        pt++;

    }

int count = 0; // 统计质数的个数
for (int i = 0; i < SIZE; i++) //打印数组元素中为TRUE的元素的下标,检查是否为质数。 if (num[i] == TRUE) {
printf(
"%d ", i+2);
        count++;
       }   printf("\n 有%d 个素数\n",count);
return 0; }

 

 

下面附上一个普通的质数找寻代码,主要通过确定被整除的次数,而缩短计算过程

2.打印1~100的所有质数
# include <stdio.h>

int main()
{
    int confirmed = 0 ; //已被验证是质数的数字的个数,方便换行打印,看起来工整些
    
    for(int num = 1; num <= 100; num++)
    {
        int count = 0;  //被整除的次数 
        for(int i = 1;i<=num;i++)
        {
            
            if(num % i == 0)
               count++;
        }
        if(count < 3)
        {
            confirmed++ ;
                printf("%d ",num);
            if(confirmed % 5 == 0)
               putchar('\n'); 
        }    
    }
return 0; }

 

posted @ 2022-06-18 12:39  Tolerieren  阅读(50)  评论(0)    收藏  举报