题目描述:Count the number of prime numbers less than a non-negative number, n.
我的反应就是写一个判别素数的方法,然后从1开始遍历并判断,代码如下(知道效率会很低但是没想到其他方法):
public static int countPrimes(int n) {
if(n < 3)
return 0;
int count = 0;
for(int i = n; i > 1; i--){
if(isPrimes(i))
count++;
}
return count;
}
private static boolean isPrimes(int n){
int k = (int)Math.sqrt(n);
for(int i = 2; i <= k; i++){
if(n%i==0)
return false;
}
return true;
}
运行时在输入数据位1500000时超时了,我后来在自己电脑上测试估计运行了1s多。
后来在看讨论区时发现了一个我觉得挺牛逼的代码:
public static int countPrimes(int n) {
boolean[] m = new boolean[n];
int count = 0;
for (int i=2; i<n; i++) {
if (m[i])
continue;
count++;
for (int j=i; j<n; j=j+i)
m[j] = true;
}
return count;
}
正好是用了归纳的思想来判别素数,真的挺精彩的。瞬间感觉自己高中搞过的数学竞赛都白学了!