线性筛法求素数

线性筛法是一种优化的求素数方法,相比%2~sqrtn算法,它大大减少了时间复杂度。当需要构建素数表时,线性筛选法通过找出素数并排除其倍数来提高效率。
摘要由CSDN通过智能技术生成

求素数是比较基本的内容,有时候我们会需要打一个素数表。一般如果n比较小我们会使用(%2~sqrtn)这种算法,简单但是时间耗费很多,复杂度是O(n^2)。这里介绍一种筛选求素数法,基本要点是,如果找到一个素数如3,那么就往后筛出所有3的倍数。

一般筛选求素数:

void init()
{
	memset(prim, true, sizeof(prim));
	for (int i = 2; i*i <= maxn; i++)
	{
		if (prim[i])		//如果是素数就把其倍数全删掉
			for (int j = i; i*j <= maxn; j++)//j从i开始可以避免一部分重复
				prim[i*j] = false;
	}
}
这个方法比一般的打表法快,但运算中间有大量重复,如:i=2时,筛除30=2*15,但i=5时,筛除30=5*6,重复的标示了。
void init()
{
	for (int i = 2; i < maxn; i++)
	{
		if (!map[i])
		{
			for (int j = i; j < maxn; j+=i)
				map[j] = map[j / i] + 1; //这样还可以统计i由几个素因子构成
		}
	}
}

线性筛选求素数:

void init()
{
	memset
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值