我们在求解问题的时候会经常碰到素数(问题),以下对素数求解问题比较
素数:素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
1:根据定义我们能够写出以下代码判断素数
思路:枚举2到n-1判断他们能否被整除,不能即是素数
int prime(int n)
{
for(int i=2;i<n;i++)
if(n%i==0)return 0;
return 1;
}
题目描述:求出1-N中的所有素数
输入
大于1的正整数N
输出
1-N中的所有素数,(以从小到大的格式输出)
样例输入9
样例输出2 3 5 7
#include<iostream>
using namespace std;
int prime(int n)
{
for(int i=2;i<n;i++)
if(n%i==0)return 0;
return 1;
}
int main()
{
int n;
cin>>n;
for(int i=2;i<=n;i++)
{
if(prime(i))
cout<<i<<" ";
}
return 0;
}
2:对1进行优化
思路:枚举2到sqrt(n)能否被整除,不能即是素数。
int prime(int n)
{
for(int i=2;i*i<=n;i++)
if(n%i==0)return 0;
return 1;
}
3:对2的优化
我们有时候在会遇到求前1000000个素数,如果继续枚举,在时间有限的情况下会超时的,那么如何更有效地节约时间,就需要提前预处理以下,对素数打表。
埃式筛法:
思路:首先枚举2,筛选2的倍数4,6,8…都被筛选走了,接下来枚举3,3的倍数6,9,12…也被筛选走了,最终留下来的都是素数
memset(vis,0,sizeof(vis));
for(int i=2;i<=n;i++)
for(int j=2*i;j<=n;j+=i)
vis[j]=1;
这样我们就得到了前n个素数。
4:对3的优化
memset(vis,0,sizeof(vis));
for(int i=2;i*i<=n;i++)
{
if(!vis)
for(int j=i*i;j<=n;j+=i)
vis[j]=1;
}