浅谈(C语言)Eratoshenes筛法寻找素数与一般算法

爱拉托塞斯筛法(Eratoshenes筛法)是一种寻找素数的方法,又称平凡除法厄拉托塞斯(Eratoshenes)筛法
其是应用定理“设n是正整数,如果对虽有的素数p≤√n,都有p不能整除n,则n一定是素数.”得到的一个寻找素数的确定性方法。下面给出具体描述:
对任意给定的正整数N,要求出所有不超过N的素数。列出N个整数,从中删除不大于√N的所有素数P1,P2,P3,……,Pk的倍数(除素数P1,P2,P3,……,Pk外)。具体的是依次删除,
            P1的倍数:2·P1,3·P1,4·P1,……,[N/P1]·P1;
            P2的倍数:2·P2,3·P2,4·P2,……,[N/P2]·P1;
            P3的倍数:2·P3,3·P3,4·P3,……,[N/P3]·P1;
                    …………
            Pk的倍数:2·Pk,3·Pk,4·Pk,……,[N/Pk]·P1.
余下的整数(不包括1)就是所有求的不超过N的素数([x]表示小于或等于x的最大整数)。

通过上面的的解释,我们知道爱拉托塞斯筛法是指从2到N删去√N内所有素数的2倍、3呗、4呗、……、[N/P1]倍,剩下的就是N内的素数。而通常情况下我们求解N内的素数的一般方法为,i从2到N循环,依次判断i能否被2到√i间的所有数整除,由此来找出N内的素数。看似爱拉托塞斯筛法简单,其实分析得其算法复杂度与循环次数比基本算法要复杂许多,下面分享本人写的2种算法代码及其速度比较:


1.下面是本人写的爱拉托塞斯筛法寻找素数的算法代码:
#include <stdio.h> #include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <time.h>
void main( )
{
    long max,k ,k1,i,j,m,ad,sd;
    sd=0;
    ad=0;
    long *a;
    long start,end;
    printf("请输入一个数:");
    scanf("%ld",&max);                    //输入一个数
    start = clock();
    k=(long)sqrt((float)max);
    printf("开平方后取整k=%ld",k);
    if(NULL==(a=(long*)malloc(sizeof(long)*max)))
    {
        printf("memmery error!\n");
        exit(1);
    }
    for(i=0;i<max;i++){                    //初始化数组a,记录1~max
        a[i]=i+1;
    }
    long *s;                            //s记录K内的素数
    if(NULL==(s=(long*)malloc(sizeof(long)*k)))
    {
        printf("memmery error!\n");
        exit(1);
    }
    for(i=0;i<k;i++){                    //初始化数组s
        s[i]=0;
    }

    for(m=2;m<=k;m++){                    //求k内的素数
        k1=int(sqrt(double(m)));
        for(i=2;i<=k1;i++){                //while(m%i && i<=k1)
            if(m%i==0)                    //  i++;
                break;                    //
        }
        if(i>k1){
            
            s[sd]=m;
            sd++;                        //sd即为k内素数的个数
        }
    }
    printf("\n%ld内的素数有:\n",k);
    for(i=0;i<sd;i++){                
        if(s[i]!=0)
            printf("%ld\t",s[i]);
    }
    
    for(i=2;i<max;i++){                    //爱拉托塞斯筛选
        for(m=0;m<sd;m++){
            for(j=2;j<=(max/s[m]);j++){
                if(a[i]==(j*s[m]))
                    a[i]=0;
            }
        }
    }
    
    end = clock();
    printf("\n不超过%ld的素数有:\n",max);
    for(i=1;i<max;i++){                
        if(a[i]!=0)
            printf("%ld\t",a[i]);
    }
    printf("用时%ld毫秒\n",end-start);
    getchar();
    getchar();
}
编译运行,输入10000,其结果如下,运行时间为863毫秒:

2.下面是本人写的基本一般寻找素数的算法代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <time.h>
void main()
{
    long max,k,i,m;
    long start,end;
    printf("请输入一个数:");
    scanf("%ld",&max);                    //输入一个数
    start = clock();
    printf("\n%ld内的素数有:\n",max);
    for(m=2;m<=max;m++){                    //求k内的素数
        k=int(sqrt(double(m)));
        for(i=2;i<=k;i++){                //while(m%i && i<=k)
            if(m%i==0)                    //  i++;
                break;                    //
        }
        if(i>k){
            
            printf("%ld\t",m);
                    
        }
    }
    end = clock();
    
    printf("用时%ld毫秒\n",end-start);
    getchar();
    getchar();
}
编译运行,输入10000,其结果如下,运行时间为81毫秒:



通过上面的比较,发现爱拉托塞斯筛法寻找素数的速度明显比基本算法慢好几倍。
本人技术有限,代码不保证100%完美,些许部分或有不妥或有改善之处,或是你有更好的算法,欢迎评论交流!

#C/C++##笔经#
全部评论

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
小火柴燃烧吧:接啊,接了之后反手在咸鱼找个大学生搞一下,量大从优
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务