• 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

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

  • 相关阅读:
    遂宁2017届零诊16题(仅想说明网传答案的不正确)
    当参变分离遇见洛必达
    高考数学九大超纲内容(1)wffc
    给王志红老师构造的函数,想说明搜题软件的解答过程的不严谨!
    记住路径名
    php返回文件路径
    两个字符串合并为一个字符串的各种方法
    global作用域
    二进制字符串的比较
    var_dump — 打印变量的相关信息
  • 原文地址:https://www.cnblogs.com/morethink/p/5917642.html
Copyright © 2020-2023  润新知