查找素数

441 阅读2分钟

打印出100-200000所有的素数

题目:判断100-200之间有多少个素数,并打印出所有的素数清单

算法分析:判断一个整数是不是素数,主要看这个数能不能被比它小的整数整除,比如:3不能被2整除,3是素数;4能被2整除,4不是素数;5不能被2、3、4整除,5是素数;

初始实现:

for (int i = 100; i <= 200000; i++) {
            // 循环嵌套遍历被除数
            for (int m = 2; m <= i; m++) {
                // 判断,如果能被不是自己本身之外的数整除,直接跳出循环
                if (i != m && i % m == 0) {
                    // 退出循环
                    break;
                }
                // 判断,此时该数肯定是素数
                if (i == m && i % m == 0) {
                    // 打印该值
                    System.out.print(i + "\t");
                }
            }
        }

优化思路 1.遍历时尽量避免进入到循环体内,所以针对偶数以及可以被三整除的所有数进行优化;针对偶数的优化可以节省1/2的计算量,针对被三整除的数,节省1/3的计算量 2.一共数的最小公约数一定不大于这个数的平方根 例如 4=22 9=33 因此可以不用遍历所有小于该数的数; 3.配合偶数的优化前面将i++优化为 i=i+2;加速循环。 优化后

    private static final long START = 100;
    private static final long END = 200000;
    public static void main(String[] args) throws UnsupportedEncodingException {
        long start = System.currentTimeMillis();
        for (long i = START; i <= END; i++) {
            if (isPrimeNumber(i)) {
                System.out.print(i + "\t");
            }
        }
        System.out.println("cost = " + (System.currentTimeMillis() - start));
        long start1 = System.currentTimeMillis();
    }
    private static boolean isPrimeNumber(long number) {
        boolean result = true;
        if ((number > 1)) {
            //除去2的偶数都是素数
            if (number % 2 == 0) {
                return false;
            } else if (number % 3 == 0) {
                return false;
            } else {
                //循环时排除偶数,加速
                double max = Math.sqrt(number);
                for (int i = 3; i <= max; i = i + 2) {
                    if (number % i == 0) {
                        result = false;
                        break;
                    }
                }
            }
        } else {
            return false;
        }
        return result;
    } 
    
    **
    总结
    
    结果是为优化前耗时6.626秒 优化后耗时0.0102秒 计算时间约节省65倍。
    **