<1>什么是筛选法
所谓筛选法是指“埃拉托色尼筛法”,埃拉托色尼是古希腊的著名数学家。它采用的方法是,在一张纸上写上1~1000的全部整数,然后逐个判断他们是否为素数,只要找到一个非素数就把他去掉,最后剩下的数就为素数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32...
<2>方法思路
(1)先把1给置0,因为他不是素数。
(2)将剩下的数(2、3、4、5...)将第二个及后面的数模上2(3%2、4%2、5%2...),如果模数等于0即表明该数是2的倍数,将2的倍数置0。
(3)将剩下的数(2、3、0、5...)将第三个及后面的数模上3(5%3、7%3、9%3...),如果模数等于0即表明该数是3的倍数,将3的倍数置0。(注意这里运算的时候没有让已经变成0的数参与运算,我们在写条件的时候就应该注意这一点)
(4)重复上面第2~3步工作,直到将100之间的素数全部找完为止。
<3>代码实现
#include <stdio.h>
#include <math.h>
int main()
{
int arr[100] = {0};
int i = 0;
int j = 0;
for (i = 0; i < 100; i++)
{
arr[i] = i+1; //将数组arr[0]~arr[99]从数1遍历到100
}
arr[0] = 0;
for (i = 0; i < sqrt(100); i++)
{
for (j = i + 1; j < 100; j++) //j=i+1是为了使得arr[j]>arr[i]
{
if (arr[i] != 0 && arr[j] != 0) //这里是为了让大于0得数字进来参与运算
{
if (arr[j] % arr[i] == 0) //如果arr[j]是arr[i]得倍数,就让arr[j]变为0
{
arr[j] = 0;
}
}
}
}
for (i = 0; i < 100; i++) //将100之间的素数打印出来
{
if (arr[i] > 0)
printf("%d ",arr[i]);
}
return 0;
}
上面程序的关键在于
if (arr[i] != 0 && arr[j] != 0)
{
if (arr[j] % arr[i] == 0)
{
arr[j] = 0;
}
}
下面是i=1执行完毕以后的数据
以i=2为例:
i=2,j=3,arr[i]和arr[j]中arr[j]等于0,条件不满足。进入下一次循环,j=4,满足arr[i] != 0 && arr[j] != 0但是不满住arr[j] % arr[i] == 0,所以arr[j] 也就是 arr[4]不会被置零。当j=8、14、20、26...时,此时才满洲arr[j] % arr[i] == 0,所以响应位置的数被置为零,如下图所示。
经过上面操作直到循环结束,arr[0]~arr[99]里面剩下不是0就是素数,我们只需要将大于0的数打印出来,就是我们想要的素数
如果上面的解题方法对你有帮助,还请多多点赞,谢谢