##筛法
//埃筛
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int cnt;
bool st[N];
int prime(int n)
{
for (int i = 2 ; i <= n ; i ++)
{
if (!st[i])
{
cnt ++;
for (int j = i + i ; j <= n ; j = j + i) st[j] = true;
//删除质数的倍数,合数一定是质数的倍数
}
}
return cnt;
}
int main()
{
int n;
cin>>n;
cout<<prime(n);
return 0;
}
//欧拉筛法,也是线性筛法
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int cnt ,prime[N];
bool st[N];
int get_prime (int n)
{
for (int i = 2 ; i <= n ; i ++)
{
if (!st[i]) prime[cnt ++] = i;
for (int j = 0 ; prime[j] <= n / i ; j ++)
{
//以下俩个条件保证了一个合数一定会被最小的质因子筛去,具体的可以举例
st[prime[j] * i ] = true;
if (i % prime[j] == 0) break;
}
}
return cnt;
}
int main()
{
int n;
cin>>n;
cout<<get_prime(n)<<endl;
return 0;
}