题目:
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
遇到这种题,我们第一个想到的可能是直接遍历,1-n,看小于n的质数的数量。这样可以实现功能,但是在LeetCode中会超时。
int countPrimes(int n){
int i,j,k,num=0,flag;
for(i=2;i<n;i++)
{
flag=1;
k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0) flag=0;
if(flag){
num++;
}
}
return num;
}
那么我们怎么办呢?我想到了谭浩强C程序设计的课本上有个题,使用筛选法求出100以内的题目。然后又想到,如果a是质数的话,a的倍数肯定不是a的质数,那么,就有了如下代码:
//写一个函数判断是否质数
int isflag(int n)
{
int i,k;
if(n<=1) return 0;
k=(int)sqrt(1.0*n);
for(i=2;i<=k;i++)
{
if(n%i==0) return 0;
}
return 1;
}
int countPrimes(int n){
int i,j,sum=0,m;
if(n%2==0) m=n/2;
else m=n/2+1;
int *a = malloc(sizeof(int)*n);
for(i=2;i<n;i++)//进行初始化
a[i]=0;
for(i=2;i<m;i++)
{
if(isflag(i))//如果i是质数,则其倍数不是
{
for(j=i+i;j<n;j+=i)
a[j]=j;
}
}
for(i=2;i<n;i++)
if(a[i]==0)
{
//printf("%3d",i);
sum++;
}
return sum;
}
这样虽然是通过了,但是执行时间太长,内存消耗太大,终究不是最佳的解决方案。先这样,想到了更好的方法再进行补充,欢迎大家留言交流!