题目描述
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
提交代码如下:
代码思路:如果不借助辅助空间,代码提交会超时。因此代码中开辟了一个与n大小相同的数组来标识数组下标的数字是否是质数。因为非质数一定可以标示为所有质数的乘积,即n=(a1^n1)*(a2^n2)*...,n为非负整数,因此判断是否是质数的除法只需要判断能否整除小于它平方根的质数即可。
int countPrimes(int n) {
if(n<3)
{
return 0;
}
else if(n==3)
{
return 1;
}
else if(n==4)
{
return 2;
}
int *prime=(int *) malloc(sizeof(int)*n);
memset(prime,0,sizeof(prime));
prime[0]=0;
prime[1]=0;
prime[2]=1;
prime[3]=1;
int count=2;
int i=4;
for(i=5;i<n;i++)
{
int j=2;
int flag=0;//标识是否整除某个数,0标识不能整除所有的数,否则为1
for(j=2;j<sqrt(i)+1;j++)
{
if((prime[j]==1)&&(i%j==0))//只计算被i整数的是质数
{
prime[i]=0;
flag=1;
break;
}
}
if(flag==0)
{
prime[i]=1;
count++;
}
}
free(prime);
return count;
}