ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

B2128 素数个数

2021-07-05 17:35:37  阅读:171  来源: 互联网

标签:B2128 埃氏 int 复杂度 个数 枚举 素数 Theta


题目

给你一个n,求1~n的素数的个数。

素数:即约数只有1和它本身的数。

题解

这里介绍两种办法:暴力和埃氏筛。

暴力

从1~n枚举,看每个数是否为素数,是则累加。

时间复杂度:\(\Theta (n\sqrt{n} )\)

空间复杂度:\(\Theta (1)\)

埃氏筛

先预处理,枚举\(i\),从\(1\)到\(\sqrt{n}\),再枚举\(j\),从\(i\)(等会解释为什么是\(i\))到\(n/i\),每个\(i*j\)(因为不只两个约数,所以不是素数)判定为非素数。

为什么\(j\)要从\(i\)开始枚举:

其实也可以从2(不能从1,因为\(i\)为素数)开始枚举,但2$i-1$的之前都以枚举过了,可以不再枚举,节省时间~。

时间复杂度:\(\Theta (n\log{n} )\)

空间复杂度:\(\Theta (n)\)

代码

暴力

#include<bits/stdc++.h>
using namespace std;

int sum;
bool ss(int x)
{
	if(x<=1)return false;//0,1不是素数
	for(int i=2;i*i<=x;i++)//注意i不能从1开始枚举(因为每个数都有1这个约数),枚举到x的开方可以节省时间(也可枚举到x-1或x/2)
		if(x%i==0)//如果x能被非1或它本身的数整除,则说明x非素数
			return false;//返回非素数
	return true;//x只有两个约数,返回是素数
}
int main()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
		if(ss(i))//如果是素数
			sum++;//累加
	cout<<sum;

	return 0;
}

埃氏筛

#include<bits/stdc++.h>
using namespace std;

bool a[50004];//a[i]表示i是否为素数
int sum;
void ssb(int n)
{
	memset(a,true,sizeof(a));//先假定全部为素数
	a[0]=false;a[1]=false;//0,1不是素数
	for(int i=2;i*i<=n;i++)//枚举i
		if(a[i])//如果i是素数(如果不是则说明i*j之前枚举过了,不用再次枚举)
			for(int j=i;i*j<=n;j++)//枚举j
				a[i*j]=false;//a[i*j]不是素数
}
int main()
{
	int n;cin>>n;
	ssb(n);//素数表
	for(int i=1;i<=n;i++)
		if(a[i])//如果是素数则累加
			sum++;
	cout<<sum;

	return 0;
}

标签:B2128,埃氏,int,复杂度,个数,枚举,素数,Theta
来源: https://www.cnblogs.com/wuzhenhao/p/14973468.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有