素数筛选法
2016-03-28 23:04
435 查看
筛选法(埃拉托色尼(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
思想:逐个筛选,直到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> #include <stdlib.h> //#include <string.h> int isprime(int n) { int i; if(n == 1) return 0; for(i=2;i<(int)sqrt(n);i++) if(n%i == 0) return 0; return 1; } int main() { int n,i,j; scanf("%d",&n); int *num = (int*)malloc(sizeof(int)*(n+1)); //memset(num,0,n+1);//不能将动态开辟的数组数都初始化为0 for(i=1;i<=n;i++) num[i] = 0; //挖数 num[1] = 1; for(i=2;i<=(int)sqrt(n);i++) { if(!num[i]) { if(isprime(i)) { for(j=2*i;j<=n;j++) //挖掉质数的倍数的数 if(j%i == 0) num[j] = 1; } } } for(i=1;i<=n;i++) if(!num[i]) printf("%d ",i); printf("\n"); return 0; }
相关文章推荐
- 深入PHP中的引用
- VIM环境的Markdown配置
- UDP 和 TCP 对比讲解
- Spring3自定义环境配置 <beans profile="">
- 南阳理工学院软件月赛
- HTTP深入浅出
- 如何利用gulp构建前端自动化
- 第三百六十天 how can I 坚持
- 单链表各种操作,VS2013+番茄插件写着真爽
- MyBatis关于识别器和缓存的简单理解
- 面试准备
- hdu-5637 Transform(位运算+bfs)
- linux下安装JDK和tomcat以及遇到的误区
- 【学习笔记】高性能MySQL(第三版)——第2章:MySQL基准测试
- Linux网络属性配置
- [JSTDG]JavaScript函数
- 大整数乘法-分治
- Spark-Mllib(一)数据类型
- HDOJ 2046 骨牌铺方格
- 2016春季练习——bfs简单题