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

筛选法求素数———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;
}
  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值