#include<iostream>
using namespace std;



bool IsPrime[1000010];  //保证不做素数的倍数
int Prim[1000010];   //存素数
void euler_prime(int n){
    int num = 0, j;
    for(int i = 2; i <= n; i ++){
        if(!IsPrime[i])   //不是目前找到的素数的倍数    1不是素数
            Prim[num ++] = i;  //记录质数
        for(j  = 0; j < num; j ++){
            if(i * Prim[j] > n)
                break;
            IsPrime[i * Prim[j]] = true;  //筛;//找到的素数的倍数不访问
            if(i % Prim[j] == 0)
                break;  //i可以看做prime[j]*某个数， i*prime[j+1]就可以看做 prime[j]*某个数*prime[j+1] 。而 prime[j] 必定小于 prime[j+1]，所以 i*prime[j+1] 必定已经被 prime[j]*某个数 筛掉，就不用再做了（等到i=6即最大合因子时会筛掉）
        }
    }
}

int setans(int x)
{
    int cnt = 0;
    for(int i=2; i<=x; i++) {
        if(!IsPrime[i])
            cnt++;
    }
    return cnt;
}
int main()
{
    int n;
    euler_prime(1000005);
    while(scanf("%d",&n))

        printf("%d\n",setans(n));

    return 0;
}
