求解1到n之间素数的个数
2015-10-18 11:17
417 查看
常用方法:
上述算法的时间复杂度为O(n*sqrt(n));
2、埃拉托斯特尼筛法:
给出要筛数值的范围n,找出
![](http://upload.wikimedia.org/math/d/4/3/d435c6dd92f3b3430d735f360cba0ec9.png)
以内的素数
![](http://upload.wikimedia.org/math/3/b/2/3b2bf95de725fc71fb65b4c8d3446dad.png)
。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。
![](http://img.my.csdn.net/uploads/201304/16/1366075332_8323.gif)
代码实现:
package test; import java.util.Scanner; public class PrimeCount { //判断一个数是否为素数的时间复杂度为O(sqrt(n)) boolean isPrime(int num){ if(num < 2) return false; int i = 2; for(;i*i<=num;i++){ if(num %i==0) break; } if(i*i >num) return true; return false; } public static void main(String[] args) { PrimeCount pc = new PrimeCount(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int count = 0; for(int i =1;i<=n;i++){ if(pc.isPrime(i)) count++; } sc.close(); System.out.println(count); } }
上述算法的时间复杂度为O(n*sqrt(n));
2、埃拉托斯特尼筛法:
给出要筛数值的范围n,找出
![](http://upload.wikimedia.org/math/d/4/3/d435c6dd92f3b3430d735f360cba0ec9.png)
以内的素数
![](http://upload.wikimedia.org/math/3/b/2/3b2bf95de725fc71fb65b4c8d3446dad.png)
。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。
![](http://img.my.csdn.net/uploads/201304/16/1366075332_8323.gif)
代码实现:
package test; import java.util.Scanner; public class PrimeCount { int primeFilter(int num){ boolean array[] = new boolean[num+1]; for(int i = 2;i<=num;i++){ array[i] = true; } int count =0;//素数个数 for(int i=2;i*i<=num;i++){ if(!array[i])//不是素数 continue; //将当期素数的倍数置为false,为合数 int j= i*2; while(j<=num){ if(array[j]) array[j]= false; j+=i; } } for(boolean bool:array) { if(bool) count++; } return count; } public static void main(String[] args) { PrimeCount pc = new PrimeCount(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int count = 0; long start = System.currentTimeMillis(); count = pc.primeFilter(n); long end = System.currentTimeMillis(); System.out.println("time use:"+(end-start)); sc.close(); System.out.println(count); } }时间复杂度为O(n*loglog(n)),接近于线性时间
相关文章推荐
- Extjs用ajax提交表单四种方式
- 最近看的有关经济金融工程的博客随笔之类归纳下
- 《编写可维护的JavaScript》笔记
- maven概览
- java jdbc笔记整理
- 对UserDict的研究
- 数组指针和指针数组
- system V信号量
- 集合(三):ConcurrentHashMap
- 反射实现的几种方法
- div自动居于窗口的正中间的css原理
- Android基础之Activity生命周期
- centos7下mksdcard不能运行
- 数据库选型之亿级数据量并发访问(MySQL集群)
- js编程题以及答案
- 关键字驱动测试
- Search a 2D Matrix II
- 解决:perhaps the designated entry point is not set?
- 逆波兰计算器
- linux0.99网络模块-物理层(中断处理)