筛法列举质数

思想:标记出所有非质数,输出所有未被标记的数。

对于n以内的筛选来说,如果n是合数,则有 1 ≤ c ≤ √n ,即 1 ≤ c2 ≤ n , c是n的最小正因数。只要找到了c就可以确定n是合数并将n标记。

1     int n = 15;
2     int mark[16] = {
3         1, 1, 0, 0,
4         0, 0, 0, 0,
5         0, 0, 0, 0,
6         0, 0, 0, 0
7     };

设n = 15,先声明一个数组mark,里面除了0和1被标记为1(即为false)之外,别的都未被标记。已知2为最小的质数,所以我们让2作为第一个正因数,开始筛选,筛选完后输出15以内的所有质数:

 1     int c;
 2     int j;
 3     for (c = 2; c * c <= n; c++) {
 4         if (mark[c] != 1) {
 5             for (j = 2; j <= n / c; j++) {
 6                 mark[c * j] = 1;
 7             }
 8         }
 9     }
10     for (c = 2; c <= n; c++) {
11         if (mark[c] != 1) {
12             printf("%d\n", c);
13         }
14     }

伪代码:

1 function Eratosthenes
2     Let A be an array of Boolean values,
3     indexed by integers 2 to n
4     initially all set to true.
5     for index from 2 to sqrt(n)
6         if A[i] is true
7             for j from 2 to n/index
8                 A[j] = false
9     Output: all i such that A[i] is true
时间: 2024-10-12 14:07:46

筛法列举质数的相关文章

电影里的代码之《机械姬》:筛法求质数

今天看了<机械姬>,探讨人工智能话题的电影,豆瓣评分7.5,还是蛮不错的一部电影.影片1:09:29处出现了一段python代码,细看了一下,发现是筛法求质数的python代码,写得非常简练的.先贴个电影的截图: 影片里的代码略微有点模糊,我重新打一遍,是下面这个样子的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #coding:utf8 import sys def sieve(n):    

【基础练习】埃拉托色尼筛法求质数

跑了一个质数表,哈希可能能用到 一开始跑的是0x3f3f3f3f以内,这个数等于1061109567 十亿多一点 结果什么软件也打不开那么大的文件 里奥说估计有一亿多个质数 于是换成一千万以内 跑出来了 代码放上 上次忘了古诗文···还是两句 --夜来风雨声,花落知多少 --有约不来过夜半,闲敲棋子落灯花 版权声明:转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看

利用筛法求质数

1 package algorithm; 2 //转载请注明 3 public class FilterPrime { 4 public static void filterPrime(int n) { 5 boolean[] isPrimes = new boolean[n+1]; 6 for(int i=2;i<=n;i++){ 7 isPrimes[i]=true; 8 } 9 isPrimes[2]=true; 10 for(int j=2;j<=n;j++){ 11 if(isPri

一些数学基础(辗转相除法、筛法、快速幂)

看个题目 1 #include<iostream> 2 using namespace std; 3 int gcd(int a,int b) 4 { 5 if(b==0) 6 { 7 return a; 8 } 9 else 10 { 11 return gcd(b,a%b); 12 } 13 } 14 int main() 15 { 16 int t; 17 cin>>t; 18 while(t--) 19 { 20 int n,a,b; 21 cin>>n>

求质数的几种算法

1.根据质数的定义求 质数定义:只能被1或者自身整除的自然数(不包括1),称为质数. 利用它的定义可以循环判断该数除以比它小的每个自然数(大于1),如果有能被它整除的,则它就不是质数. 对应代码是: void printPrime(int n){//判断n是否是质数         boolean isPrime=true;//是否是质数的标志         for(int i=n-1;i>1;i—){//n除以每个比n小比1大的自然数 if(n%i==0){//如果有能被整除的,则不是质数

数论_筛法求素数

线筛,时间复杂度O(N log log N) 原理比较易懂,因为合数可以被分解为两个因数. 所以可以反过来,两个因数的乘积必定不是质数. 所以,通过一次次的枚举两个因数,合数就被"筛选"掉了,只留下质数在筛子里. 按照上述的原理,核心代码本应该是这样的: bool vis[MAXN] = {true, true, false}; for(i = 2; i <= N; i++) { for(j = 2; i*j <= N; j++) { vis[i*j] = true; //

分解质因数的技巧

背景: 有时分解一个很大的合数,因为可能质因子很大,导致分解时复杂度不是严格O(log2n),需要用一点技巧使其复杂度得到保证. 做法: 在筛法求质数时,不用把质数存储成一张表,而用一个数组big[i]保存每个数(不管是质数还是合数)的最大质因数,接着在分解一个数x时,令y=x,之后不断地y/=big[y],并且把每次的big[y]作为x的一个质因数,这样就可以了. 20161115

信息学中的数论(二)

注:本文章中大多数定理未证明,一因为太过繁琐,二因为我太菜了不会证. 希望得到证明的就请舍弃这篇吧. 数论中有一个东西非常常见,也非常烦. 这个东西叫"质数" (及其相关知识) 那么这一篇来聊聊与质数有关的话题吧: 质数,筛质数的方法,phi函数,线性筛. 恩先说质数, 质数就是只有1和它本身两个因数的自然数. 与质数相对的就是合数 好了质数讲完了. 筛质数的方法? 判断一个数是否是质数大家都会吧,根号的做法 如果要筛出1到n之间所有的质数呢? 普通的筛法求质数,我们来归纳一下,可以通

尺取法 TwoPoint

就是两个指针表示区间[l,r]的开始与结束然后根据题目来将端点移动,是一种十分有效的做法.适合连续区间的问题 3320 这道意思是一本书有n页,每一页上有一个知识点标号a[i]可能重复,要求选择一个最小的区间使得能够覆盖所有知识点 分析:[l,r]区间推进,统计区间中能够覆盖的知识点数,对于每一个l,r都是满足可以覆盖所有知识点的最小r,处理好区间知识点数的统计就好了 1 #include <iostream> 2 #include <cstdio> 3 #include <