本文相对于大部分采用暴力循环,对每个数进行求素数的方法不同,采用了素数分布规律思想达到减少时间复杂度的目的。
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n)
{
float n_sqrt;
if(n==2 || n==3) return true;
if(n%6!=1 && n%6!=5) return false;
n_sqrt=floor(sqrt((float)n));
for(int i=5;i<=n_sqrt;i+=6)
{
if(n%(i)==0 | n%(i+2)==0) return false;
}
return true;
}
int main()
{
int n;
int total=0;
cin>>n;
if(n>5){
total++;
int a = n/6;
for(int i =1;i<=a;i++){
if(isPrime(6*i-1)&&isPrime(6*i+1)&&(6*i+1<=n)){
total++;
}
}
}
else{
if(n==5){
total=1;
}
}
cout<<total<<endl;
return 0;
}