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

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

  • 相关阅读:
    Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT
    luogu 3806 【模板】点分治
    poj 1741 Tree(树的点分治)
    置换群(本蒟蒻瞎BB的)(未完)
    uva 1153 顾客是上帝(贪心)
    关于区间的贪心问题
    uva 1615 高速公路(贪心,区间问题)
    uva 1614奇怪的股市(归纳法证明,贪心)
    uva11491 奖品的价值(贪心)
    uva12545 比特变换器(贪心)
  • 原文地址:https://www.cnblogs.com/morethink/p/5917642.html
Copyright © 2011-2022 走看看