素数筛选(《编程珠玑》学习之路)

一:一般算法:

int root(int n)

{return (int) sqrt((float) n );}


int prime(int n )

{

int i ;

for( i  = 2 ; i <= root(n);i++ )

if (n % i  == 0)

return 0;

return 1;

}

 main()

{

int i ,m;

n = 1000;

for (i = 2; i <= n ; i++)

if(prime(i))

print("%d\n",i);

}


二、加入对被2,3,5整除的正整数:

int root(int n )
{
return (int) sqrtt((float)n);
}


int prime(int n)
{
int i ,bound;
if( n % 2 == 0)
return (n == 2);
if( n % 3 == 0)
return (n == 3);
if( n % 5 == 0)
return (n == 5);
bound = root(n);
for(i = 7 ; i<= bound; i = i+2)
if( n % i == 0)
return 0;
return 1;

}

 main()

{

int i ,m;

n = 1000;

for (i = 2; i <= n ; i++)

if(prime(i))

print("%d\n",i);

}


三、埃氏筛选 (引用了其他大神的代码,解释得十分清楚

 1/*
 2     |埃式筛法|
 3     |快速筛选素数|
    |15-7-26|
4 */ 5 #include <iostream> 6 #include <cstdio> 7 using namespace std; 8 const int SIZE = 1e7; 9 10 int prime[SIZE]; // 第i个素数 11 bool is_prime[SIZE]; //true表示i是素数 12 13 int slove(int n) 14 { 15 int p = 0; 16 for(int i = 0; i <= n; i++) 17 is_prime[i] = true; //初始化 18 is_prime[0] = is_prime[1] = false; //0,1不是素数 19 for(int i = 2; i <= n; i++) 20 { 21 if(is_prime[i]) //这里比较巧妙, 我只是意会 22 { 23 prime[p++] = i; //计算素数的个数,也记录下了素数 24 for(int j = 2 * i; j <= n; j += i) // 除掉了i的倍数的数字 25 is_prime[j] = false; 26 } 27 } 28 return p; 29 } 30 31 int main() 32 { 33 int n; 34 while(cin >> n) 35 { 36 int res = slove(n); 37 cout << res << endl; 38 for(int i = 0; i < res; i++) 39 cout << prime[i] << endl; 40 } 41 }

简短的埃氏筛选:

#include<stdio.h>
void main(){
int i , p, n;
char x[1002];
n = 1000;
for( i =1; i<=n; i++)
x[i] = 1;
x[1] = 0; x[n+1] = 1;
p = 2;
while (p<=n){
printf("%d\n",p);
for( i = 2*p ; i<=n; i = i + p)
x[i] = 0;
do
p++;
while(x[p] ==0);
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值