LeetCode算法题 :计数质数countPrimes

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

示例:

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

思路1:两层循环逐一判断,数大的时候超时

public int countPrimes(int n) {
	        if(n == 0 || n == 1)return 0;
	        int sum = 0;
	        for(int i=2;i

思路2:参考别人的代码,了解到一个算法,叫做厄拉多塞筛法. 比如说求20以内质数的个数,首先0,1不是质数.2是第一个质数,然后把20以内所有2的倍数划去.2后面紧跟的数即为下一个质数3,然后把3所有的倍数划去.3后面紧跟的数即为下一个质数5,再把5所有的倍数划去.以此类推.

代码如下:

public int countPrimes(int n) {
		if(n < 3)return 0;
		int count = 0;
		boolean[] arr = new boolean[n];
		for(int i = 2;i < n;i++){
			if(arr[i] == false){
				count++;
				//第一个数为2,他是质数,从他开始将他的倍数置为非质数(true)
				for(int j=2;i*j < n;j++){
					arr[i*j] = true;
				}
			}
		}
		return count;
    }

这样2、3、5、7…依次类推的质数乘积都置为非质数,剩下的就是质数

你可能感兴趣的:(LeetCode)