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;
}