3.素数筛选,埃式晒法C#

  1.素数是大于1的自然数。只能被1和自身整除
  2.反之就是和数


   1:传入一个数N。返回nums数组。
    nums[i]=1.表示该位置的数是个和数,
    nums[i]=0表位置的数是一个素数。

在筛选法中,将 i ii 的倍数都标记为合数,由于i ∗ 2 、 i ∗ 3 、 i ∗ ( i − 1 ) i*2、i*3、i*(i-1)i∗2、i∗3、i∗(i−1)在 [ 1 , i ) [1, i)[1,i) 的筛选过程中必定已经被标记为合数了,所以 i ii 的倍数只需要从 i ∗ i i*ii∗i 开始即可
 

执行流程:

首先count[0],count[1]不是素数。直接标记成count[0]=count[1]=1;

从未标记的数中找到最小的数2,count[2]不是任何数的倍数 所有他是素数,

将对应2的倍数的设置成和数。

然后找到3。将3的倍数设置成和数。 然后找到4。因为count[4]是2的倍数所有是一个和数。然后找到以此类推。

通过这种方式遍历完数组没有标记未1的就全是素数了

  private int[] 埃式晒法2(int Value)
    {
        int[] count = new int[Value+1];
        count[0] = count[1] = 1;
        if (Value <=1)
        {
            return null;
        }
        for (int i = 2; i*i <=Value; i++)
        {
            if (count[i] ==0)
            {
                for (int j = i * i; j <=Value; j += i)
                {
                    count[j] = 1;
                }
            }
        }
        return count;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值