查找从2到N的全部素数
代码如下
#include <bits/stdc++.h>
using namespace std;
#define maxn 1000000
bool valid[maxn];
void getPrime(int n,int &tot,int ans[maxn])
{
//N 要查找素数的范围;
//tot 素数数量总和;
//ans 素数表;
tot=0;
int i,j;
for(i=2; i<=n; i++) //将要查找素数fanwei内的valid全部赋值为true;
valid[i]=true;
for(i=2; i<=n; i++)
{
if(valid[i])
{
if(n/i<i)
break;
for(j=i*i; j<=n; j+=i) //将不是素数的数所对应的valid[i]赋值为false;
valid[j]=false;
}
for(i=2; i<=n; i++) //将[2,n]范围内的所有素数存入ans数组中;
if(valid[i])
ans[tot++]=i;
}
}
int main()
{
int n,tot;
int ans[100000];
tot=0;
cin>>n;
getPrime(n,tot,ans);
cout<<tot<<endl;
for(int i=0;i<tot;i++)
cout<<ans[i]<<" ";
return 0;
}
此处对第21行的for循环中的内容( for(j=i*i; j<=n; j+=i) )进行解析:
设一个合数(非素数)为 J = α ⋅ β J=\alpha\cdot\beta J=α⋅β,且 α ≤ β \alpha\leq\beta α≤β。
- 当 α \alpha α为素数时(无论此时 β \beta β是合数还是素数),因为 α ≤ β \alpha\leq\beta α≤β,可知 α 2 ≤ α ⋅ β = J ≤ N \alpha^{2}\leq\alpha\cdot\beta=J\leq{N} α2≤α