用动态bool型数组处理。
筛选法求素数:对2、3、4……n的数,先除去2的倍数,再去除3的倍数,将所有可能的倍数去除后,剩下的数就是素数。
具体方法是设下标为2、3、4、……n的bool型数组元素为true,对i=2、3、……n,将下标为2i,3i,……直到超过n的元素值改为false,以表示除去这些下标值,最后下标仍为true的元素就是素数。
#include<iostream>
using namespace std;
int main()
{
int i,j,n;bool *p;
cin>>n;p = new bool[n+1]; //定义动态bool数组
for(i=2;i<=n;i++) p[i]=true; //数组中的所有元素都为true
for(i=2;i<=n;i++)
{for(j=2;i*j<=n;j++) p[i*j]=false;} // 把所有的i的倍数的下标的元素改为false
for(i=2;i<=n;i++)
if(p[i]) cout<<i<<"\t";cout<<endl; //输出所有的素数
delete[]p;
return 0;
}
易错点:
1. 主要语句(有两种写法)
for(i=2;i<=n;i++)
{for(j=2;i*j<=n;j++) p[i*j]=false;} //这里有一个易错点一定要是i*j<=n;而不能是j<=n,若是j<=n,则i*j越界,出错!
{for(j=2*i;j<=n;j+=i) p[j] = false;}//用+来代替*,是一个道理,同时也确保数组下标不越界
2. 不要忘记最后释放动态数组~