您的位置:首页 > 其它

Easy-题目59:204. Count Primes

2016-05-30 22:35 204 查看
题目原文:

Count the number of prime numbers less than a non-negative number, n.

题目大意:

问<n的素数有多少个?

题目分析:

使用埃拉托色尼筛法。

该算法描述如下:(Translate from wikipaedia.)

列出从2到n的序列;

初始化p为序列第一个数(目前为2,这是废话,2当然是素数了);

划掉所有p的倍数;

如果序列第一个数的平方>=n,则剩下的数都是素数,否则goto 2.

源码:(language:java)

public class Solution {
public int countPrimes(int n) {
if( n <=2)
return 0;
int count = 1;
boolean isNotPrime[] = new boolean[n+1];
for(int i=3;i*i<=n;i=i+2) {
if(!isNotPrime[i]) {
for(int j= i*i ;j<=n;j=j+2*i)
isNotPrime[j] = true;
}
}
for(int i = 3;i<n;i=i+2) {
if(!isNotPrime[i])
count++;
}
return count;
}
}


成绩:

11ms,beats 99.20%,众数28ms,6.70%

cmershen的碎碎念:

可能大多数提交的代码都用的是朴素解法,所以埃拉托色尼筛法可以击败这么大比例的提交代码……(暴力从2-n尝试,时间复杂度为O(n3/2))

附朴素解法(现在提交这个好像会超时):

public int countPrimes(int n) {
int count = 0;
for (int i = 1; i < n; i++) {
if (isPrime(i)) count++;
}
return count;
}

private boolean isPrime(int num) {
if (num <= 1) return false;
// Loop's ending condition is i * i <= num instead of i <= sqrt(num)
// to avoid repeatedly calling an expensive function sqrt().
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) return false;
}
return true;
}


by the way….hihocoder中似乎介绍了一个更快的算法,见http://hihocoder.com/contest/hiho93/problem/1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: