判断一个数是不是素数最简单的方法不是筛法,但是筛法求素数的复杂度低,不容易超时;
核心内容也就下边这句话:
用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最 小的数 是素数,然后去掉它的倍数。
#include<iostream>
#include<cstdio>
using namespace std;
bool flag[10000000]; //bool 类型的标记数组,方便下边输出时候判断
int main()
{
int n ;
cin>>n;
flag[1] = false ; //第一个数特判
for(int i = 2 ; i <= n ; i ++) //遍历一遍,全部标为可以用的
flag[i] = true ;
for(int i = 2 ; i <= n ; i ++)
{
if(flag[i] == true )
for(int j = 2 ; j <= n ; j ++) //核心 , 把从1开始的、某一范围内的正整数从小到大顺序排列,剩下的数中选择最 小的数 是素数,然后去掉它的倍数。
{
flag[i*j] = false ;
}
}
for(int i = 2 ; i <= n ; i ++)
if(flag[i]) //判断输出
cout<<i<<endl;
return 0 ;
}
下边是一个
多组输入的筛法求素数 ,具体实现过程大体相同,标记数组用0,1一样可以实现的。
#include<iostream>
#include<cstdio>
using namespace std;
int flag[1000000] ;
int main()
{
int n;
while(~scanf("%d",&n))
{
flag[1] = 0 ;
for(int i = 2 ; i <= n ; i ++)
{
flag[i] = 1;
}
for(int i = 2 ; i <= n ; i ++)
{
if(flag[i] == 1 )
{
for(int j = 2 ; j*i <= n ; j ++)
{
flag[i*j] = 0;
}
}
}
for(int i = 2 ; i <= n ; i ++)
{
if(flag[i])
cout<<i<<endl;
}
}
return 0;
}