模板:筛素数法

参考:http://blog.csdn.net/liukehua123/article/details/5482854

1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false.

2.然后:

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

{   if(prime[i])

for( j=i+i; j<=n; j+=i ) prime[j]=false;

}

3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。

原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质

数的倍数筛掉。

Code:

 1 #include <cmath>
 2
 3 #define MAX_NUM 10000
 4
 5
 6 bool * arr_prime = new bool[MAX_NUM + 1];
 7
 8 for(i = 3; i <= MAX_NUM; i += 2) arr_prime[i] = true;
 9 for(i = 4; i <= MAX_NUM; i += 2) arr_prime[i] = false;
10 arr_prime[2] = true;
11
12 int sqrt_mn = sqrt(MAX_NUM);
13
14 for(i = 3; i < sqrt_mn; i += 2)
15 {
16     if(arr_prime[i])
17     {
18         for(j = i + i; j <= MAX_NUM; j += i) arr_prime[j] = false;
19     }
20 }
21     
时间: 2024-08-26 04:38:25

模板:筛素数法的相关文章

筛素数法小结

筛选素数方法小结: 最简单的筛素数法方法就是从2开始,将所以2的倍数去掉,然后从3开始,将3的倍数去掉,依次进行下去即可.根据这样很容易写出代码,下面代码就是是筛素数法得到100以内的素数并保存到primes[]数组中. 1 const int MAXN = 100; 2 bool flag[MAXN]; 3 int primes[MAXN / 3], pi; 4 void GetPrime_1() 5 { 6 int i, j; 7 pi = 0; 8 memset(flag, false,

最一般的筛素数法

1 int countPrimes(int n) { 2 vector<bool> prime(n,true); 3 prime[1]=prime[0]=false; 4 for(int i=3;i<n;i++) 5 if(i%2==0) 6 prime[i]=false; 7 8 for(int i=3;i<sqrt(n);i++) 9 if(prime[i]) 10 for(int j=i*i;j<n;j+=i) 11 prime[j]=false; 12 13 retu

洛谷 P3383 【模板】线性筛素数

P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行包含一个不小于1且不大于N的整数,即询问概数是否为质数. 输出格式: 输出包含M行,每行为Yes或No,即依次为每一个询问的结果. 输入输出样例 输入样例#1: 100 5 2 3 4 91 97 输出样例#1: Yes Yes No No Yes 说明 时空限制:5

标记素数法(模板)+素数打表

#include <stdio.h> #include <string.h> #define N 3000000 int f[3000000]; int main() { memset(f, 0, sizeof(f)); int i, j; f[0]=1; f[1]=1; for(i=2; i<=N; i++) { if(f[i]==0) { for(j=i*2; j<=N; j+=i) { f[j]=1; //不是素数 } } } // 打印所有发f[i]==0, 即

常见模板(欧拉筛素数,最小生成树,快排,并查集,单源最短路)

欧拉筛素数: #include<cstdio> #define maxn 10000000+10 using namespace std; int n,prime[5000001],num_prime=0,m; bool if_prime[maxn]; void euler(int limit) { for(int i=2;i<=limit;i++) { if(!if_prime[i]) prime[++num_prime]=i; for(int j=1;prime[j]*i<=l

线性筛素数模板

传送门:线性筛素数 Prime: 1 #include<cstdio> 2 3 const int MAXN = 10000100; 4 int Prime[MAXN],n,m,Size; 5 bool Vis[MAXN]={1,1}; 6 7 int main() 8 { 9 scanf("%d%d",&n,&m); 10 for(int i=2;i<n;i++) 11 { 12 if(!Vis[i]) 13 Prime[++Size]=i; 14

Poj2689筛素数

题目大意: 给定一个区间l,r,求这个区间内相邻的质数中最近的两个和最远的两个.区间范围是1-2^31,区间的长度最多是10^6. 思路: 刚开始对筛选法的理解不深,不知道如何筛选任意一段区间的素数,看了题解恍然大悟,原来用的筛选法总是筛选从1-n的素数,对于为何这样筛选理解不深刻.说下1-n的筛选法,就是用一个数组is_prime[1..n]标记1-n中哪个是素数哪个不是,从2(第一个素数)开始扫描,所有2的倍数都不是素数,那么下一个素数是谁?就是我们向后从is_prime[]中找到的第一个是

leetcode 204. Count Primes(线性筛素数)

Description: Count the number of prime numbers less than a non-negative number, n. 题解:就是线性筛素数的模板题. class Solution { public: int countPrimes(int n) { int ans=0; vector<int>is_prime(n+1,1); for(int i=2;i<n;i++){ if(is_prime[i]){ ans++; for(int j=2*

线性筛素数详细整理

如果你在1个月前让我判断素数,我一定会猛敲出以下代码: bool check( int num ) { int tmp =sqrt( num); for(int i= 2;i <=tmp; i++) if(num %i== 0) return 0 ; return 1 ; //实在是太慢了! } $ $ 下面给大家带来3种筛选素数和一种直接判断素数 $ $ $ $ 什么是线性筛? 对于求多个质数时与其一个个判断不如用排除法,用空间换取大量时间. $ $ $ $ $ $ 一般筛法(埃拉托斯特尼筛法