LeetCode笔记——204计数质数

题目:

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

示例:

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

思路:1:开始自己想的挺简单的,对于每一个小于n的数,逐个计算能不能被整除其他数。但这种算法超时。而且即使是写这种简单的代码还一直出错。。。。

代码:执行超时

class Solution {
    public int countPrimes(int n) {
        int num=0;
        int i=2;    //i,j要在循环体外定义
        int j=2;
        for(i=2;i        {
           for(j=2;j            {
               if((i%j==0)&&(i!=j))   //i是合数时,跳出内循环
               break;
           }
            if(j>i)             //当i是质数时,j会一直增加,知道大于i
                num=num+1;
            
       }
        return num;
    }
}

思路2:这是leetcode提示中的代码,区别主要在于内循环的范围。当i^2大于n时,n就不可能整除i了,缩小了内循环的范围。

代码超时:

class Solution {
    public int countPrimes(int n) {
        
   int count = 0;
   for (int i = 1; i < n; i++) {
      if (isPrime(i)) count++;
   }
   return count;
}

private boolean isPrime(int num) {
   if (num <= 1) return false;
   // Loop's ending condition is i * i <= num instead of i <= sqrt(num)
   // to avoid repeatedly calling an expensive function sqrt().
   for (int i = 2; i * i <= num; i++) {
      if (num % i == 0) return false;
   }
   return true;
}
    
}

思路3:

以下是借鉴网上大神的埃拉托色筛选法。这种方法可以用来求解一定范围内的质数。

(1)先把1删除(现今数学界1既不是质数也不是合数)

LeetCode笔记——204计数质数_第1张图片

(2)读取队列中当前最小的数2,然后把2的倍数删去

(3)读取队列中当前最小的数3,然后把3的倍数删去

(4)读取队列中当前最小的数5,然后把5的倍数删去

(5)读取队列中当前最小的数7,然后把7的倍数删去

(6)如上所述直到需求的范围内所有的数均删除或读取

大神的代码:

public class Solution {

    public int countPrimes(int n) {

        if (n <= 1) {
            return 0;
        }

        // 默认所有的元素值都会设置为false
        boolean[] notPrime = new boolean[n];
        notPrime[0] = true;
        notPrime[1] = true;

        for (int i = 2; i * i < n; i++) {
            // 如果i是一个质数,i将i的倍数设置为非质数
            // 如是i是一个合数,则它必定已经设置为true了,因为是从2开始处理的
            if (!notPrime[i]) {   //当前标为false的数就是质数,将质数的倍数删掉,标为true
                for (int j = 2 * i; j < n; j += i) {
                    notPrime[j] = true;
                }
            }
        }

        // 统计质数的个数
        int result = 0;
        for (boolean b : notPrime) {
            if (!b) {
                result++;
            }
        }

        return result;
    }
}

 

你可能感兴趣的:(LeetCode笔记)