求质数算法的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 奇数,\(\sqrt{n}\)

思考后发现

  1. 素数一定是奇数
  2. 若 n=ab 是个合数(其中 a 与 b ≠ 1), 则其中一个约数 a 或 b 必定至大为 \(\sqrt{n}\).
        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

速度果然有很大的提高。

以时间换空间。

Prime - 程序员的修养的更多相关文章

  1. 程序员的修养 -- 如何写日志(logging)

      在程序中写日志是一件非常重要,但是很容易被开发人员忽视的地方.写好程序的日志可以帮助我们大大减轻后期维护压力. 在实际的工作中,开发人员往往迫于的巨大时间压力,而写日志又是一个非常繁琐的事情,往往 ...

  2. Linux下main函数启动过程【程序员自我修养笔记】【自用】

    1. 入口函数和程序初始化 1.1 程序从main开始吗? 当程序执行到main函数的第一行时,很多事情都已经完成了: [证1]如下是一段C语言代码: 代码中可以看到,在程序刚刚执行到main的时候, ...

  3. pwn学习日记Day10 《程序员自我修养》读书笔记

    第一章 从 Hello world 说起 抛出问题: 1.程序为什么要被编译器编译后才能执行? 2.编译器在把C语言程序转换成可以执行的机器码的过程中做了什么,怎么做的? 3.最后编译出来的可执行文件 ...

  4. ***IT程序员自我修养和情商提升文章

    低情商的13个表现 --------------------------------------------------------------------- — THE END —

  5. pwn学习日记Day18 《程序员的自我修养》读书笔记

    知识杂项 obj文件:当前源代码编译成二进制目标文件 exe文件:将.obj文件与库文件.lib等文件链接生成的可执行文件 一个现代编译器的主要工作流程如下: 源程序(source code)→ 预处 ...

  6. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习

      C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...

  7. 不要困在自己建造的盒子里——写给.NET程序员(附精彩评论)

    此文章的主旨是希望过于专注.NET程序员在做好工作.写好.NET程序的同时,能分拨出一点时间接触一下.NET之外的东西(例如10%-20%的时间),而不是鼓动大家什么都去学最后什么都学不精,更不是说. ...

  8. 程序员的自我修养(2)——计算机网络(转) good

    相关文章:程序员的自我修养——操作系统篇 几乎所有的计算机程序,都会牵涉到网络通信.因此,了解计算机基础网络知识,对每一个程序员来说都是异常重要的. 本文在介绍一些基础网络知识的同时,给出了一些高质量 ...

  9. gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)

    最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...

随机推荐

  1. 用LSTM分类 MNIST

    LSTM是RNN的一种算法, 在序列分类中比较有用.常用于语音识别,文字处理(NLP)等领域. 等同于VGG等CNN模型在在图像识别领域的位置.  本篇文章是叙述LSTM 在MNIST 手写图中的使用 ...

  2. Hadoop(十五)MapReduce程序实例

    一.统计好友对数(去重) 1.1.数据准备 joe, jon joe , kia joe, bob joe ,ali kia, joe kia ,jim kia, dee dee ,kia dee, ...

  3. BZOJ:1443: [JSOI2009]游戏Game

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1443 反正不看题解我是完全想不出系列…… 先把棋盘黑白染色,也就是同一对角线上颜色相同,使 ...

  4. Prim最小生成树板子

    普里姆算法可以称为"加点法",每次迭代选择代价最小的边对应的点,加入到最小生成树中.算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点. 邻接矩阵存图  时间复杂度O(n^2 ...

  5. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  6. SSH防爆破脚本

    github地址:https://github.com/demonxian3/LittleScript/blob/master/SSHprotecter.sh 使用方法: 1.给足脚本权限,chmod ...

  7. Spring框架学习笔记(1)——HelloWorld

    1.创建一个新的项目,并添加Spring框架 2.创建HelloWorld.java package com.broadtext.beans.helloworld; public class Hell ...

  8. eclipse(Version: Mars.2 Release (4.5.2)) groovy plugin install process.

    There are two way to install : First: 1.check your eclipse version:Help-->About Eclipse 2.open He ...

  9. JEECG 3.7.2版本发布,企业级JAVA快速开发平台

    JEECG 3.7.2版本发布 -  微云快速开发平台 JEECG是一款基于代码生成器的J2EE快速开发平台,开源界"小普元"超越传统商业企业级开发平台.引领新的开发模式(Onli ...

  10. 好的Qt学习资料

    1.青春不老,奋斗不止!---CSDN博客地址http://blog.csdn.net/liang19890820: