<pre name="code" class="html">
点击打开链接
</pre><pre code_snippet_id="1973199" snippet_file_name="blog_20161108_4_7065142" name="code" class="cpp">
</pre><pre code_snippet_id="1973199" snippet_file_name="blog_20161108_5_2746744" name="code" class="cpp">#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
const int N=1e6+1;
const ll inf=1<<30;
vector<int> h;
int vis[N];
ll pri[N];
int main()
{
int n;
memset(vis,0,sizeof(vis));
for(int i=0;4*i+1<=N;i++)
{
h.push_back(i*4+1);
}
vis[h[0]]=1;
int pn=0;
for(int i=1;i<h.size();i++)//晒出h素数
{
if(!vis[h[i]])
{
pri[pn++]=h[i];
for(int j=h[i]+h[i];j<=N;j+=h[i])
{
vis[j]=1;//H素数只能写成1*h 素数的倍数不是素数
}
}
}
while(cin>>n&&n)
{
memset(vis,0,sizeof(vis));
ll ans=0;
// 1e4 cout<<pn<<endl;
//筛出H素数后 定义Semi-prime为两个H素数乘积 暴力即可
for(int i=0;i<pn;i++)
{
if(pri[i]*pri[i]>n) //n<=1e6
break;
for(int j=i;j<pn;j++)
{
int mul=pri[i]*pri[j];
if(mul<=n)
{
if(!vis[mul])
{
vis[mul]=1;
ans++;
}
}
else
break;
}
}
cout<<n<<' '<<ans<<endl;
}
return 0;
}