- #include <iostream>
- using namespace std;
- bool flag[10000];
- int prime[10000];
- int main()
- {
- memset(flag,0,sizeof(flag));
- int t=0;
- for(int i=2;i<=10000;i++)
- {
- if(!flag[i]){
- prime[t++]=i;
- for(int j=2;i*j<=10000;j++)
- flag[i*j]=1;
- }
- }
- for(int i=0;i<=100;i++)
- cout<<prime[i]<<"\t";
- cout<<endl;
- }
- 另一种:
- 我推荐这个算法! 易于理解。 只算奇数部分,时空效率都还不错!
- half=SIZE/2;
- int sn = (int) sqrt(SIZE);
- for (i = 0; i < half; i++)
- p[i] = true;// 初始化全部奇数为素数。p[0]对应3,即p[i]对应2*i+3
- for (i = 0; i < sn; i++) {
- if(p[i])//如果 i+i+3 是素数
- {
- for(k=i+i+3, j=k*i+k+i; j < half; j+=k)
- // 筛法起点是 p[i]所对应素数的平方 k^2
- // k^2在 p 中的位置是 k*i+k+i
- // 下标 i k*i+k+i
- //对应数值 k=i+i+3 k^2
- p[j]=false;
- }
- }
- //素数都存放在 p 数组中,p[i]=true代表 i+i+2 是素数。
- //举例,3是素数,按3*3,3*5,3*7...的次序筛选,因为只保存奇数,所以不用删3*4,3*6....
几种筛选求素数的实现
最新推荐文章于 2024-04-27 21:11:05 发布