zoukankan      html  css  js  c++  java
  • B2128 素数个数

    题目

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

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

    题解

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

    暴力

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

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

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

    埃氏筛

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

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

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

    时间复杂度:(Theta (nlog{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;
    }
    
  • 相关阅读:
    7、NFC技术:让Android自动运行程序
    6、Android中的NFC技术
    5、NFC概述
    Delphi XE7中开发安卓程序一些有用的帮助资源
    Delphi开发安卓程序的感受
    Tomcat绿色版启动"startup.bat"一闪问题的解决方法!
    Delphi判断字符串中是否包含汉字,并返回汉字位置
    Delphi的DLL里如何实现定时器功能?
    Delphi的DLL里如何实现定时器功能?
    VS2013如何添加LIb库及头文件的步骤
  • 原文地址:https://www.cnblogs.com/wuzhenhao/p/14973468.html
Copyright © 2011-2022 走看看