eratosthenes筛选法

写下从2至某个上限的之间的所有整数,在算法的剩余部分,你遍历整个列表并剔除所有不是质数的整数。

找到列表中的第一个不被剔除的整数(也就是2),然后将列表后面所有逢双的数都剔除,因为它们可以被2整除,接着,再回到列表头部重新开始,此时列表中尚未被剔除的第一个元素是3,所以在3之后把每逢第3个数剔除,再回到列表开头,以此类推,反复进行,最后列表中的未被剔除的全为质数。

先考虑实现最简单的这样一种功能,后面我们将改良这个算法:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define SIZE 1000
 4 #define FALSE 0
 5 #define TRUE 1
 6
 7 int
 8 main()
 9 {
10     char sieve[SIZE];    //筛选数组
11     char * sp;
12     int number;           //用来表示数字
13     int sum=0;
14
15     for(sp=&sieve[0];sp<&sieve[SIZE];sp++)     //将数组所有的值初始化为真
16         *sp=TRUE;
17
18     for(number=2;;number++)            //在循环内部设置退出循环
19     {
20         sp=&sieve[0]+number-2;          //将指针指向第一个数
21         if(sp>=&sieve[SIZE])           
22             break;
23         while(sp+=number,sp<&sieve[SIZE])    //往后跳number个数并将其置0
24         {
25             *sp=FALSE;
26         }
27     }
28     for(number=2,sp=&sieve[0];sp<&sieve[SIZE];number++,sp++)    //
29     {
30         if(*sp)
31         {
32             sum++;
33             printf("%d\t",number);
34         }
35         if(sum%5==0)
36             printf("\n");
37     }
38     printf("the total of count is:%d",sum);
39
40 }

这样得到1000内有168个质数。

这个算法需要筛选数组的第一个数为质数,在上面的代码中为2,事实上,我们可以节省一点空间,因为偶数除了2以外都不是质数,所以我们可以直接从奇数入手,这样,可以找的范围就扩大了一倍,稍微改一下以上的代码即可:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define SIZE 1000
 4 #define FALSE 0
 5 #define TRUE 1
 6
 7 int
 8 main()
 9 {
10     char sieve[SIZE];
11     char * sp;
12     int number;
13     int sum=0;
14
15     for(sp=&sieve[0];sp<&sieve[SIZE];sp++)
16         *sp=TRUE;
17
18     for(number=3;;number+=2)        //改变初值及遍历奇数
19     {
20         sp=&sieve[0]+(number-3)/2;       //注意是第一个数
21         if(sp>=&sieve[SIZE])
22             break;
23         while(sp+=number,sp<&sieve[SIZE])
24         {
25             *sp=FALSE;
26         }
27     }
28     for(number=3,sp=&sieve[0];sp<&sieve[SIZE];number+=2,sp++)      //注意循环量的改变
29     {           printf("2\n");             //2也为质数
30         if(*sp)
31         {
32             sum++;
33             printf("%d\t",number);
34         }
35         if(sum%5==0)
36             printf("\n");
37     }
38     printf("the total of count is:%d",++sum);    //2也为质数
39
40 }

这样我们可以得到在2000以内有303个质数。

时间: 2024-10-27 05:35:02

eratosthenes筛选法的相关文章

每日一小练——Eratosthenes 筛选法

上得厅堂.下得厨房.写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:Eratosthenes筛选法 内容: 求质数是一个非常普遍的问题,通常不外乎用数去除.除到不尽时,给定的数就是质数. 可是早在2000年前人们就知道了一个不必用除法而找出2~N的全部质数的方法.如果一个非常奇妙的筛子,能够给出一个数.比如i,这个筛子有办法把i全部的倍数去掉. 请用这种方法求出2~N之间的全部质数.即Eratosthenes筛选法. 我的解法:上来没多想.打开vs2013就敲了起来.问题果然非常eas

Eratosthenes筛选法计算质数

<C和指针>第6章第4道编程题: 质数就是只能被1和本身整除的数.Eratosthenes筛选法是一种计算质数的有效方法.这个算法的第一步就是写下所有从2至某个上限之间的所有整数.在算法的剩余部分,遍历整个列表并剔除所有不是质数的整数. 后面的步骤是这样的.找到列表中的第1个不被剔除的数(也就是2),然后将列表后面所有逢双的数都剔除,因为它们都可以被2整除,因此不是质数.接着,再回到列表的头部重新开始,此时列表中第一个尚未被剔除的第1个数是3,所以在3之后把每逢第3个数(3的倍数)剔除.完成这

Eratosthenes筛选法构造1-n 素数表

筛选法:对于不超过n的每个非负整数p,删除2p,3p,4p...当处理完所有数之后,还没没删除的就是素数. 代码中进行了相应的优化. 1 #include<bits/stdc++.h> 2 using namespace std; 3 int vis[10000]; 4 int main() 5 { 6 int n; 7 while(scanf("%d",&n)) 8 { 9 //-------------- 10 int m=sqrt(n+0.5); 11 mem

UVA10789 Prime Frequency【筛选法】

Given a string containing only alpha-numerals (0-9, A-Z and a-z) you have to count the frequency (the number of times the character is present) of all the characters and report only those characters whose frequency is a prime number. A prime number i

算法笔记_012:埃拉托色尼筛选法

1 问题描述 Compute the Greatest Common Divisor of Two Integers using Sieve of Eratosthenes. 翻译:使用埃拉托色尼筛选法计算两个整数的最大公约数.(PS:最大公约数也称最大公因数,指两个或多个整数共有约数中最大的一个) 2 解决方案 2.1 埃拉托色尼筛选法原理简介 引用自百度百科: 埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthene

素数筛选法

筛选法(埃拉托色尼(Eratosthenes)筛法)求素数,例如1~100 思想:逐个筛选,直到int(sqrt(100))个 1)因为1不是质数,将1筛去 2)2是质数,将2的倍数全都挖掉 3)3是质数,将3的倍数全都挖掉 4)4已经被挖去,不进行与4相关的操作 5)5是质数,将5的倍数全都挖掉 6)这个过程一直进行到后面的数全都挖掉为止 不是从1开始:如10~18----一个一个筛--->18 #include <stdio.h> #include <math.h> #i

HDU 1215.七夕节【筛选法】【7月26】

七夕节 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,而且和数字王国的人们说:"你们想知道你们的还有一半是谁吗?那就依照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才是自己的还有一半.告演示样例如以下: 数字N的因子就是全部比N小又能被N整除的全部正整数,如12的因子有1,2,3,4,6. 你想知道你的还有一半吗? Input 输入数据的第一行是一个数字T(1<=T<=500000),它表明測试数据的组数.然后是T组測试数据,每组測试数据仅仅有一个数字N(

Eratosrhenes筛选法

1简介 埃拉托色尼选筛法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.-194B.C.)提出的一种筛选法. 是针对自然数列中的自然数而实施的,用于求一定范围内的质数,它的容斥原理之完备性条件是p=H~. 2步骤 (1)先把1删除(现今数学界1既不是质数也不是合数) (2)读取队列中当前最小的数2,然后把2的倍数删去 (3)读取队列中当前最小的数3,然后把3的倍数删去 (4)读取队列中当前最小的数5,然后把5的

埃拉托色尼筛选法

埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.-194B.C.)提出的一种筛选法. 是针对自然数列中的自然数而实施的,用于求一定范围内的质数. (1)先把1删除(现今数学界1既不是质数也不是合数) (2)读取队列中当前最小的数2,然后把2的倍数删去(3)读取队列中当前最小的数3,然后把3的倍数删去(4)读取队列中当前最小的数5,然后把5的倍数删去(5)如上所述直到需求的范围内所有的数均删除或读