204. 计数质数
题目链接:
https://leetcode-cn.com/problems/count-primes/comments/
解题思路:
1、传统方法不行的,超时
2、使用见埃拉托色尼筛法
如果要实现筛法,需要一个O(n)的数组来存储每一个数是不是素数,暂定为true,筛选,把不是素数的定为false,最终数组里为true的就是所有的素数了。如何筛选?p是素数,那么2p, 3p……一定不是素数。事实上,如果筛的是2p, 3p……那么考虑 2*3这个数,它被2筛了一次,又被3筛了一次,没有必要。可以这样筛选:对于每一个素数p,筛掉p^{2}, p^{2}+p, p^{2} + 2p……
并不需要对[2, n]的每一个数进行筛选,只需要对[2, \sqrt{n}]进行筛选,即可筛出所有不是素数的数
1 class Solution { 2 public int countPrimes(int n) { //暴力算法是过不了的qwq 3 //这个要用筛法实现 4 boolean[] isPrime = new boolean[n]; 5 int result = 0; 6 7 for (int i = 2; i < n; i++) { 8 isPrime[i] = true; //先初始化为true 9 } 10 11 for (int i = 2; i * i < n; i++) { //这一次for循环找出所有不是素数的数(也就是说被筛掉了) 12 if (!isPrime[i]) { 13 //既然已经被筛掉了就不用管了 14 continue; 15 } 16 else { 17 for (int j = i * i; j < n; j += i) { 18 //由于i现在是一个素数, 那么i的平方一定不是素数,i^2 + i; i^2 + 2i也一定不是素数 19 isPrime[j] = false; 20 } 21 } 22 } //所有不是素数的数已经全部筛掉 23 24 //计算剩余的素数个数 25 for (int i = 2; i < n; i++) { 26 if (isPrime[i] == true) { 27 result++; 28 } 29 } 30 return result; 31 } 32 33 }
1 class Solution { 2 public int countPrimes(int n) { 3 int count=0; 4 for(int i=2;i<n;i++) 5 { 6 int flag=0; 7 for(int j=2;j<=Math.sqrt(i);j++) 8 { 9 if(i%j==0) 10 { 11 flag=1; 12 } 13 } 14 if(flag==0) 15 count++; 16 } 17 return count; 18 } 19 }