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 }

 

posted @ 2019-07-24 21:24  王爷爱吃秋刀鱼  阅读(135)  评论(0编辑  收藏  举报