[求效率最高的算法]求1~n内的所有质数
来源:互联网 发布:淘宝新卖家可以直播吗 编辑:程序博客网 时间:2024/05/20 20:22
【列出质数】
请列出1~n内的所有质数。
【问题背景】
这是以前在CSDN论坛上看到的一个面试官写给应聘者建议中说到的一个问题,他说自己找到了一种最简单的方法,当然具体是什么方法没写出来。大学的时候学Fortran,经常没事干就琢磨用程序解决实际问题,印象比较深刻的就是9行代码取出1~n内的所有质数,当时自认为是效率最高的代码,列出来和有兴趣的朋友一起讨论,同时欢迎指正。当然更希望能看到那位面试官的答案。
【普通做法】
最常见的做法就是通过求余实现。
int max = 1000000;
boolean[] primes = new boolean[max + 1];
for (int i = 0; i < max + 1; i++)
primes[i] = i % 2 != 0;
primes[1] = false;
primes[2] = true;
for (int i = 5; i < max; i+=2) {
if (!primes[i])
continue;
int sqrt = (int) Math.sqrt(i);
for (int ii = 3; ii <= sqrt; ii++) {
if (i % ii == 0) {
primes[i] = false;
break;
}
}
}
int count = 1;
for (int i = 3; i < max + 1; i+=2){
if (primes[i]) count++;
}
System.out.println(max+"范围内的质数个数为:"+count);
输出结果:78498
计算用时:759 ms
【筛法】
下面通过筛法来实现。
int max = 1000000;
boolean[] primes = new boolean[max + 1];
for (int i = 0; i < max + 1; i++)
primes[i] = i % 2 != 0;
primes[1] = false;
primes[2] = true;
int kk = 3;
int sqrt = (int) Math.sqrt(max);
do {
for (int i = kk * kk; i < max + 1; i += 2 * kk)
primes[i] = false;
do {
kk += 2;
}
while (!primes[kk] && kk <= sqrt);
}while (kk <= sqrt);
int count = 1;
for (int i = 3; i < max + 1; i+=2){
if (primes[i])
count++;
}
System.out.println(max+"范围内的质数个数为:"+count);
输出结果:78498
计算用时:15 ms
【简单分析】
[1]筛法很浪费空间。
[2]对于寻找1~n以内的所有质数,筛法无疑是最快的,因为它几乎不用任何运算就可以将某个质数的所有倍数排除掉。
[3]那位面试官说找到了最简单的方法,我认为只可能是对
for (int i = kk * kk; i < max + 1; i += 2 * kk)
进行改进,考虑过很长时间,不知道该如何改进。
- [求效率最高的算法]求1~n内的所有质数
- 算法-求n内的所有质数
- 求100内的所有素数(质数)
- 求N之内的所有质数
- C++求N以内所有的质数
- 求小于正整数N的所有质数
- Java求n以内的所有质数
- 求N以内所有质数的和
- 【质数算法】——判断质数、求小于N的质数、求前N个质数
- 求质数算法的N种境界
- 求质数算法的N种境界
- 求质数算法的N种境界
- 经典算法(1)- 求1到N的质数
- 求质数算法的 N 种境界[1]
- 求质数算法的N种境界[1]
- 省赛i题/求1~n内所有数对(x,y),满足最大公约数是质数的对数
- 求质数的算法
- 求N内的所有素数
- Dos指令下循环的指令(类似于for()语法)
- fallout3 辐射3 难句囧翻译6(雷人啊)
- 开心!
- 数据库设计注意事项
- 从Java到C++ — 对比Java与C++编程的不同
- [求效率最高的算法]求1~n内的所有质数
- oracle中的BLOB与CLOB字段更新时的行迁移与称链接
- DOS常用命令大全
- C++论文摘藏------论C++构造函数中的不合理设计
- 什么是FPGA?
- 如何用C++编程获得某台机器的IP地址
- 温昱书评:读《代码之道》
- 新手从事Oracle性能优化时常用几个简单的步骤
- 信使理论