素数筛选(《编程珠玑》学习之路)
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);
}
三、埃氏筛选 (引用了其他大神的代码,解释得十分清楚)
简短的埃氏筛选:
#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);
}
}
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);
}
}
相关文章推荐
- 求出100以内的所有素数--筛选法和根号法
- POJ 2262 Goldbach's Conjecture 素数筛选
- 三种素数筛选法详解 (转)
- 筛选法求素数(求第t个素数是多少)
- POJ 2262 Goldbach's Conjecture ( 筛选法求素数 )
- 筛选法求素数
- 数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)
- LightOJ 1259 Goldbach`s Conjecture (哥德巴赫猜想 + 素数筛选法)
- 素数筛选法
- nefu 2 猜想(素数&&筛选)
- 筛选法求素数 & 普通法求素数
- 线性筛选求素数
- 2017 Multi-University Training Contest - Team 4 :Counting Divisors(数论:素数筛选+分解质因子+求因子数)
- 利用数组筛选素数
- 素数筛选
- 筛选法求全体素数
- 素数筛选法
- 小于等于n的素数的个数(埃式筛选法和欧拉筛选)
- 杭电4548 好长的筛选素数,打表,细节特别要注意l代表后面的大的那个数
- HDOJ(HDU) 2136 Largest prime factor(素数筛选)