ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

质数的筛法--Eratosthenes筛法

2022-06-18 13:03:01  阅读:75  来源: 互联网

标签:筛法 -- 质数 int num 数组 100 TRUE


题目来源于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; }

 

标签:筛法,--,质数,int,num,数组,100,TRUE
来源: https://www.cnblogs.com/muyangbeihai/p/16386498.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有