zoukankan      html  css  js  c++  java
  • 求素数个数的优化-LeetCode204

    问题

    计数质数
    统计所有小于非负整数 n 的质数的数量。

    示例:

    输入: 10
    输出: 4
    解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

    第一种解法容易想到但是会 超时

    class Solution {
        public int countPrimes(int n) {
        	int counter = 0;
            for (int i = 2; i < num; i++) {
                if (isPrime(i)){
                // 是素数 counter++
                    counter++;
                }
            }
            return counter;
        }
        // 判断是否是素数
        public boolean isPrime(int num){
            for (int i=2; i<num;i++){
                if(num%i==0){
                    return false;
                }
            }
            return true;
        }
    

    第二种用厄拉多塞筛法
    实现原理

    他造了一张1到50的素数表,首先写上1到50的所有自然数,然后先划去1,把2留下,再划去其他所有2的倍数,把3留下。再划去其他所有3的倍数,把5留下。又划去其他所有5的倍数……依此类推,可以得到50以内的所有素数。这就是著名的“厄拉多塞筛法”。

    public static int countPrimes(int n) {
            boolean[] isPrime = new boolean[n];
            // 数组中全部设置成true
            Arrays.fill(isPrime, true);
            for (int i = 2; i * i < n; i++) {
                // 如果是素数,排除素数的倍数,因为素数的i倍就一定不是素数, i从2开始
                if (isPrime[i]) {
                    // 让i从i平方开始,减少多余的计算,例如4x2 4x3之前都已经在2x4 3x4计算过了
                    for (int j = i * i; j < n; j += i) {
                        isPrime[j] = false;
                    }
                }
            }
            int count = 0;
            for (int i = 2; i < n; i++) {
                //最终从2开始计算素数,如果是就++
                if (isPrime[i]) {
                    count++;
                }
            }
            return count;
        }
    
  • 相关阅读:
    Java实现埃拉托色尼筛选法
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现插入排序
    Java实现插入排序
    Java实现插入排序
    使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序 good(从VS2012 update1开始支持xp和c++11)
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181323.html
Copyright © 2011-2022 走看看