用筛选法求100之内的素数(个人笔记和思路)

所谓筛选法是指“Eratosthenes筛法”,采用的方法就像拿一个“筛子”不断地筛掉一组数中非素数的数,那么剩下的就都是素数了,具体做法如下:

从1开始,先将1筛掉。(1是特殊的非素数,直接去掉即可,具体的素数定义可以参考维基百科)

然后从2开始,2是素数,2的整数倍都不是素数,都筛去。

然后3也同理,而4则是2的两倍,已经被筛去就跳过,所以下一个是5。

一直到99为止。(实际上只需要筛选到\sqrt{n}为止即可,因为\sqrt{n}\cdot \sqrt{n}<=n,已经可以筛选到n项了)

下面我们看代码

#include<stdio.h>
#include<math.h>
int is_prime(int x)//判断素数函数
{
	int k = 0;
	for (k = 2; k < sqrt(x); k++)
	{
		if (x % k == 0)
			return 0;
	}
	return 1;
}

void print_prime_number()
{
	int i = 0;
	int arr[100] = { 0 };//arr[i]中放的为0表示是素数,为1表示是非素数
	for (i = 2; i < 100; i++)//从2到100判断下去,是素数就把它的j倍都筛去,标记为非素数;非素数的跳过
	{
		if (arr[i] == 1)//如果已经被标记为非素数就不用进行下去了
			continue;
			if (is_prime(i) == 1)
			{
				int j = 1;
				for (j = 2; i*j < 100; j++)
				{
					arr[i * j] = 1;//把是素数的那个数的n倍数都筛去
				}
			}
	}

	for (i = 2; i < 100; i++)//打印素数,打印下标即可
		if (arr[i] == 0)
			printf("%d ", i);
}
int main()
{
	print_prime_number();
	return 0;
}

实际上,可以将i的变化从(2到99)优化为(2到9)。

void print_prime_number()
{
	int i = 0;
	int arr[100] = { 0 };
	for (i = 2; i < 10; i++)
	{
		if (arr[i] == 1)//如果已经被标记为不是素数就不用进行下去了
			continue;
			if (is_prime(i) == 1)
			{
				int j = 1;
				for (j = 2; i*j < 100; j++)
				{
					arr[i * j] = 1;//把是素数的那个数的n倍数都筛去
				}
			}
	}

	for (i = 2; i < 100; i++)//打印素数
		if (arr[i] == 0)
			printf("%d ", i);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值