给定数字N,要求找到小于N的所有素数的个数。
我们需要对小于N的每个数x进行判断,判断是否为素数。
我们可以在[2,x-1]之间找x的因素,也可以在[2,sqrt(x)]之间找,当然平方根内查找速度更快。
我来介绍一种更快的方法——筛选法。时间复杂度O(Nlog(logN))。
筛选法原理在于:
1.先建立一个长度为N的数组(数组下标正好对应[0,N-1]),先假设每一个数都可能是素数
2.然后从2开始(0,1均不是素数)往后找,每当找到一个素数y时,就把y所有倍数ky(k=2,3,4,,,,(ky<N))找出来排除掉
3.由于素数的倍数都排除掉了(非素数除了0,1以外均由素数因子构成),最后剩下的就是素数了
看代码:
//返回值N以内素数的个数
int Prime(int N){
//建立长度为N的数组,初始值为false
bool* prime=(bool*)calloc(N,sizeof(bool));
int count=0;
for(int i=2;i<N;i++){
//非素数,continue
if(prime[i]){
continue;
}
//打印素数
printf("The %d prime:%d\n",++count,i);
//排除素数的倍数
for(int j=i+i;j<N;j+=i){
prime[j]=true;
}
}
//释放内存,返回
free(prime);
return count;
}