版权声明:本文为阿木寺的原创文章,未经本人允许不得转载。 https://blog.csdn.net/amusi1994/article/details/83065357
题目描述
数学中,两个素数的乘积所得的自然数我们称之为半素数。
现在我们给定一个数N,我们想要得到小于或等于N的半素数的数目。
代码
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
set<int> s;
void ChoosePrime(int a, int b)//建立[a,b]范围内的素数表
{
for (int i = a; i <= b; i++)
{
//2是素数,这里是2的倍数
if (i != 2 && i % 2 == 0) continue;
// 判断其它数值是不是素数(不要考虑2的倍数)
for (int j = 3; j*j <= i; j += 2)
{
if (i%j == 0) goto RL;
}
v.push_back(i);
RL:continue;
}
}
int main()
{
int n;
cin >> n;
ChoosePrime(2, 500000);//建立[2,500000]范围内的素数表
int i, j, p;
for (i = 0; i<v.size(); i++)//建立[2,1000 000]范围内的半素数表
{
for (j = 0; j<v.size(); j++)
{
p = v[i] * v[j];//两个素数相乘
if (p<=n) s.insert(p);
else break;
}
}
//读入数据,在半素数表中查找,看是否在该表中
cout << s.size()<< endl;
return 0;
}