筛选法求素数———C语言

筛选法求素数———C语言

前言:筛选法是一种求出一定范围内素数的方法,顾名思义,人们在纸上写下一串自然数,通过筛选法的操作将不是素数的数从纸上撕下来,留下一个个小孔。最后,纸张像筛子一样,得名筛选法。

文章目录

  • 筛选法求素数———C语言
    • 1.实现过程
    • 2.算法优化
      • 优化一
      • 优化二
    • 3.不是从1开始的打印素数

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

你可能感兴趣的:(c语言,算法,数据结构)