#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;
// }