zoukankan      html  css  js  c++  java
  • Prime

    求质数算法的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

    速度果然有很大的提高。
    以时间换空间。

  • 相关阅读:
    [转] java代码块 介绍
    win10多用户远程登录
    [读书笔记] learn python the hard way书中 有关powershell 的一些小问题
    Ansible 汇总
    Shell 研究
    Linux CenOS Python3 和 python2 共存
    Ansible安装
    MySQL 5.7.20绿色版安装详细图文教程
    Mysql常用运算符与函数汇总
    mysql 从陌生到熟练之----数据库备份恢复的实现方法
  • 原文地址:https://www.cnblogs.com/morethink/p/5917642.html
Copyright © 2011-2022 走看看