#include <iostream>
using namespace std;
#include<set>
#include<cmath>
#include<map>
// 一个质数不能由一个比它小的质数的倍数构成
int main(){
int a;
cin>>a;
map<int,int>m;
int sum=0;
for(int i=2;i<=a;i++){
if(m[i]==0){//说明不是质数的倍数 是一个质数
for(int j=1;i*j<=a;j++){ //1i 2i 3i...
m[i*j]++;//标记后面所有的质数倍数
}
}
}
//当数字n的次数为2 说明被两个不同的质数加过1 拥有两个质因数
for(int i=0;i<=a;i++){
if(m[i]==2){
sum++;
}
}
cout<<sum;
}
// //遍历法超时 剩下一个用例无法通过
// #include <iostream>
// using namespace std;
// #include<set>
// #include<cmath>
// bool Iszhishu(int a){
// if(a<=1){
// return 0;
// }
// else{
// for(int i=2;i<=sqrt(a);i++){
// if(a%i==0){
// return 0;
// }
// }
// }
// return 1;
// }
// int main() {
// int a;
// cin>>a;
// int sum=0;
// for(int i=1;i<=a;i++){//遍历 数字i
// set<int>s_zhiyinshu;//i的质因数集合
// for(int j=1;j<=i;j++){//找到i所有因数j
// if(i%j==0&&Iszhishu(j)){//j是因数而且是质数 就加入set
// s_zhiyinshu.insert(j);
// }
// }
// if(s_zhiyinshu.size()==2){
// sum++;
// }
// }
// cout<<sum;
// }