题目
思路
暴力法 O(sqrt(N))
循环对每个数字进行质数判定
埃式筛法 O(N * loglogN)
遇到质数,将质数的倍数全部标记为非质数
易错点
局部数组初始化长度不能为变量
C99标准里被提出来,叫做变长数组,但在C11里就成了个非必选项,所以编译器不一定支持这东西,c++虽说对c兼容,但c99标准后的内容大多数都支持得很局限
int isPrime[n]={0}; //n为函数入参
但是下面这种写法可以AC
上面这种写法可以AC,注意,测试用例可能为0,所以数组长度必须为n+1,否则,测试样例为0时,会出错
也可以new一个数组
int *isPrime=new int[n+1](); //也可以通过
int *isPrime=new int[12](); // 可以初始化为0
int *isPrime=new int[12]; // 为初始化
题解
埃式筛法
#include <iostream>
#include <algorithm>
using namespace std;
int countPrimes(int n) {
int count=0;
int isPrime[n+1];// 0是质数,1 不是质数
fill(isPrime,isPrime+n+1,0);
int *isPrime=new int[n+1]();
for(int i=2; i<n; i++) {
printf("%d ",isPrime[i]);
if(isPrime[i]!=0)continue;
count++;
// 将当前质数的倍数标记全部置为1
for(int j=i+i; j<n; j+=i) {
isPrime[j]=1;
}
}
return count;
}
int main(int argc,char * argv[]) {
printf("%d",countPrimes(12));
return 0;
}
暴力
#include <iostream>
#include <algorithm>
using namespace std;
bool isPrime(int v) {
if(v<=1)return false;
int sqr = (int)sqrt(1.0*v);
for(int i=2; i<=sqr; i++) {
if(v%i==0)return false;
}
return true;
}
int countPrimes(int n) {
int count=0;
for(int i=2;i<n;i++){//题目要求小于n
if(isPrime(i))count++;
}
return count;
}
int main(int argc,char * argv[]) {
printf("%d",countPrimes(25));
return 0;
}