A number is called almost prime if it has exactly two distinct prime divisors. For example, numbers 6, 18, 24 are almost prime, while 4, 8, 9, 42 are not. Find the amount of almost prime numbers which are between 1 and n, inclusive.
Input
Input contains one integer number n (1 ≤ n ≤ 3000).
Output
Output the amount of almost prime numbers between 1 and n, inclusive.
Examples Input
10
Output
2
Input
21
Output
8
如果数字恰好具有两个不同的素数除数,则称为几乎素数。 例如,数字6、18、24几乎是质数,而数字4、8、9、42不是。 找出介于1和n之间(含1和n)的几乎质数的数量。
输入值
输入包含一个整数n(1≤n≤3000)。
输出量
输出1到n之间(含1和n)的几乎质数的数量。
例子
输入
10
输出
2
输入
21
输出
8
这道是CF上的题目,我选择了用打表+set做的,题意是输出1-n中几乎质数的数量,几乎质数就是有两个不同质数的除数,即有两个不同的质因子,这里开一个前缀和数组sum,下标存放的是1-i的几乎质数的个数,因为集合的去重性,用集合才存储不同的质因子,一旦szie等于2则说明该数是几乎质数,数据最大到3000,最后打表直接输出sum[n]的值即可。AC代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <cstring>
using namespace std;
const int _max=3e3+50;
int sum[_max]={0};//前缀和数组
int main()
{
bool check(int);
for(int i=1;i<=3000;i++)
{
if(check(i))//判断一下这个数是不是几乎质数
sum[i]=sum[i-1]+1;
else
sum[i]=sum[i-1];
}
int n;
cin>>n;
cout<<sum[n]<<endl;
return 0;
}
bool check(int s)
{
set<int >beg;
for(int i=2;i*i<=s;i++)//分解质因子的过程
while(s%i==0)
{
beg.insert(i);
s/=i;
}
if(s!=1)
beg.insert(s);
if(beg.size()==2)//等于2则返回true
return true;
return false;
}