编程实现素数的筛法

 

感觉自己写得不太好 ,里面还有不少问题。希望路过的大佬指点一二!!!!

 

直接进入主题,我们要解决的问题是 求1到n范围内所有的素数。当然这个问题的难度取决n的大小。

儿童版 当n<=30的时候。(废话)不用动手脑子里面想一遍就知道有哪些素数了。

低级版 当 n<=60的时候。(废话)这时就需要自己动手写一下了。

初级版 当 n<=1e5的时候。(渐入佳境)手写就有一点难受了,最好是依靠计算器编程求这些素数。而计算机的初学者就会想到利用素数的性质来判断一个数是否是素数,及枚举这个数所有可能的因子。

最初枚举的时候枚举的是2~n-1,发现这样的枚举方法有点笨,时间复杂度也有点高,O(n*n)。

然后自然而然的想到了有一半的数不用枚举,只需要枚举2~n/2,时间复杂度也有点高,但毕竟除了一个2嘛,O(n*n/2)。

再后来想到一个合数最大的因子也不过是√n,那么这个范围又可以缩小。只需要枚举2~√n,在n比较小的时候这个时间复杂度是够的。毕竟计算机每秒能跑1e9次,(见表1)O(n*√n)。

想想这个枚举还可以优化,因为枚举的时候枚举了2,4,6,8,10…..,感觉4,6,8,10….这些东西是不用枚举的,所以这个枚举的的方法又一次得到了提高,(见表2)O(n*√n/2)。

int cnt=0;//素数的个数

    for(int i=2;i<=n;i++)

    {

        int flag=0;//标记0 为素数 

        int xx=sqrt(i);

        for(int j=2;j<=xx;j++)

        {

            if(i%j==0)

            {

               

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值