从Prime 到 程序员的修养
来源:互联网 发布:java 矩阵运算 编辑:程序博客网 时间:2024/06/16 06:32
- 求质数算法的N种境界
- 过程
- 最容易想到
- 奇数sqrtn
- 3数学知识的运用
求质数算法的N种境界
求质数算法的N种境界[1] - 试除法和初级筛法
过程
尽管题目并没有要我们写一个最优的算法,但是身为一个程序员,优化应该是一种习惯,在编程的过程中,随着思考进行优化。
如果你只能想出一个最简单的方法,难道你会有什么竞争力吗?
1 最容易想到
最开始我用的就是这个方法,可以说这是最简单的一种方法了,而且最开始,我就是想的这种方法,说明:我没有对这个问题进行思考,没有去优化它,而作为一个程序员,如何提高效率是拿到一个问题首先要思考的事情。
public static void main(String[] args) { long startTime = System.currentTimeMillis(); //获取开始时 int num = 0; for (int i = 2; i < 2000000; i++) { boolean flag = true; for (int j = 2; j < i - 1; j++) if (i % j == 0) { flag = false; break; } if (flag) { System.out.println(i); num++; } } System.out.println("The number is " + num); long endTime = System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间: " + (endTime - startTime) + "ms"); }
时间太长,已经不能计算。
2 奇数,n√
思考后发现
1. 素数一定是奇数
2. 若 n=ab 是个合数(其中 a 与 b ≠ 1), 则其中一个约数 a 或 b 必定至大为
public static void main(String[] args) { long startTime = System.currentTimeMillis(); //获取开始时 int num = 1; for (int i = 3; i < 2000000; i += 2) { boolean flag = true; for (int j = 2; j <= (int) Math.sqrt(i); j++) if (i % j == 0) { flag = false; break; } if (flag) { System.out.println(i); num++; } } System.out.println("The number is " + num); long endTime = System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间: " + (endTime - startTime) + "ms"); }
The number is 148933
程序运行时间: 2820ms
3数学知识的运用
算术基本定理 : 每个大于1的整数均可写成一个以上的素数之乘积,且除了质约数的排序不同外是唯一的
public static void main(String[] args) { int num = 0; for (int i = 2; i < 200; i++) { boolean flag = true; for (int j = 2; j < i - 1; j++) if (i % j == 0) { flag = false; break; } if (flag) { System.out.println(i); num++; } } System.out.println("The number is " + num); }
The number is 148933
程序运行时间: 1773ms
速度果然有很大的提高。
以时间换空间。
0 0
- 从Prime 到 程序员的修养
- 【程序员的自我修养】从分段机制到分页机制
- 论程序员的修养
- 程序员的编程修养
- 程序员的论坛修养
- 程序员的自我修养
- 程序员的文学修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的数学修养
- 程序员的数学修养
- 程序员的自我修养
- 程序员的修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 使用sql的一些笔记
- C#对 Json的序列化和反序列化会出现“k_BackingField”
- 《c和指针》(九)
- 面向过程与面向对象是什么?
- 值类型和引用类型的区别?写出C#的样例代码。
- 从Prime 到 程序员的修养
- Android Studio导入GitHub下载的工程
- 广播
- Java中,简单的List转Set实现
- Ubuntu16.04关闭某个卡死进程
- 1082 与7无关的数
- 剑指offer-算法题练习:part5 用两个栈实现队列
- Codevs 3411 洪水 BFS || DFS
- sql笔记