您的位置:首页 > 编程语言

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

2016-11-09 11:10 155 查看
一:一般算法:

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 算法 素数