筛选法求素数———C语言
前言:筛选法是一种求出一定范围内素数的方法,顾名思义,人们在纸上写下一串自然数,通过筛选法的操作将不是素数的数从纸上撕下来,留下一个个小孔。最后,纸张像筛子一样,得名筛选法。
1.实现过程
以1-100的素数筛选法为例
1.先将1-100放入一个数组中
2.先把1删除,1既不是素数也不是合数
3.读取当前数列的下一位2,并将2往后的数组里的每一个2的倍数“筛出去”
4.读取下一位3,并将3往后的每一个3的倍数“筛出去”
5.读取下一位5,并将5往后的每一个5的倍数“筛出去”
注意:
1.“筛出去“就是指将这个数组元素赋为0
2.变为0的元素会不会影响后续的筛序过程呢?又该如何避免呢?
代码实现
#include <stdio.h>
int main()
{
int i = 0;
int arr[100] = { 0 };
for (i = 0; i < 100; i++)
{
arr[i] = i + 1;//为数组元素赋上1-100
}
arr[0] = 0;
for (i = 1; i < 100; i++)
{
if (0 == arr[i])//避免已经筛出去的元素影响后续的筛选,例如在筛2的倍数这一轮时,4的倍数已经全被筛出去了
{
continue;
}
int j = 0;
for (j = i + 1; j < 100; j++)
{
if (arr[j] != 0)//0除以任何数余数都为0,所以筛出去的元素不能用来筛后面的元素
{
if (arr[j] % arr[i] == 0)
{
arr[j] = 0;
}
}
}
}
printf("这是使用筛选法判断出来的素数:");
for (i = 0; i < 100; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
return 0;
}
2.算法优化
优化一
不需要使用2-100的所有倍数,只需要使用2-7就可以了,可以解决任意范围的素数了
e.g.使用筛选法求1-100的素数
#include <stdio.h>
int main()
{
int i = 0;
int arr[200] = { 0 };
for (i = 0; i < 100; i++)
{
arr[i] = i + 1;
}
arr[0] = 0;
for (i = 1; i < 7; i++)
{
if (0 == arr[i])
{
continue;
}
int j = 0;
for (j = i + 1; j < 100; j++)
{
if (arr[j] != 0)
{
if (arr[j] % arr[i] == 0)
{
arr[j] = 0;
}
}
}
}
printf("这是使用筛选法判断出来的素数:");
for (i = 0; i < 100; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
return 0;
}
优化二
每次筛选从这个数的平方开始就可以
#include <stdio.h>
int main()
{
int i = 0;
int arr[200] = { 0 };
for (i = 0; i < 100; i++)
{
arr[i] = i + 1;
}
arr[0] = 0;
for (i = 1; i < 7; i++)
{
if (0 == arr[i])
{
continue;
}
int j = arr[i];
for (j = j * j; j <= 100; j++)
{
if (arr[j - 1] != 0)
{
if (arr[j - 1] % arr[i] == 0)
{
arr[j - 1] = 0;
}
}
}
}
printf("这是使用筛选法判断出来的素数:");
for (i = 0; i < 100; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
return 0;
}
3.不是从1开始的打印素数
我的想法暂时是这样,但是不知道有没有更间接的思路,如果各位大佬有好的想法的话,麻烦请在评论区分享一下,我每天都会看的
#include <stdio.h>
int main()
{
int i = 0;
int arr[200] = { 0 };
for (i = 0; i < 200; i++)
{
arr[i] = i + 1;
}
arr[0] = 0;
for (i = 1; i < 13; i++)
{
if (0 == arr[i])
{
continue;
}
int j = arr[i];
for (j* j; j < 200; j++)
{
if (arr[j] != 0)
{
if (arr[j] % arr[i] == 0)
{
arr[j] = 0;
}
}
}
}
printf("这是使用筛选法判断出来的素数:");
for (i = 100; i < 200; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
return 0;
}