计数质数
做了四个题了,碰到的第一个自己没想出来的题,记录一下。惨不忍睹,哈哈,不过现在想想还挺简单的,老夫的聪明才智怎么回事,可能太累了,对
官方答案用了一个叫埃氏筛。
不想复制粘贴了,我就自己说一下吧,方便以后自己看。
题目是这样的:
给你一个数n,让你统计所有小于它的质数,然后告诉别人一共有几个质数,最后比一比谁说的最快。
1.最最最一般的方法就是一个一个找呗,具体就是,一个for循坏,从i(i大于等于2且小于n)开始,用比i还小的数j(它是大于等于2且小于i),然后看看i是否能整除j,如果有一个j让i整除了,那不好意思,i就不是一个质数,然后就一个一个试呗。
2.第二个就是不试到n了,也就是试到根号n,
3.这个就是埃氏筛了:
一个让你秒懂的图
从2到10内,先把2的倍数全部干掉,再把3的倍数全部干掉,4已经被2干掉了,同理再5, 再7,就没了,剩下的就是质数,然后还可以简化一下,比如干掉5的倍数时,就没必要从2*5开始了,因为被2干掉了,所以可以直接从5的平方开始了。Very Nice!
class Solution {
public int countPrimes(int n) {
int[] isPrime = new int[n];
Arrays.fill(isPrime, 1);
int ans = 0;
for (int i = 2; i < n; ++i) {
if (isPrime[i] == 1) {
ans += 1;
if ((long) i * i < n) {
for (int j = i * i; j < n; j += i) {
isPrime[j] = 0;
}
}
}
}
return ans;
}
}