//啦啦啦,开数论了
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10010;
int prime[N],cnt;
bool st[N];
//1.试除法判定质数
bool is_prime(int n)
{
if(n<2)return false;//质数大于等于2
for(int i=2;i<=n/i;i++)//若有质数,则有俩约数,取i<=n/i那个即可
{
if(n%i==0)//除1和本身外还有其他约数
return false;
}
return true;
}
//2.分解质因数
void devide(int n)
{
for(int i=2;i<=n/i;i++)
{
if(n%i==0)//i一定是质数
{
int s=0;//质因数i的个数
while(n%i==0)
{
n/=i;
s++;
}
printf("%d %d\n",i,s);
}
}
if(n>1)printf("%d %d\n",n,1);
}
//3.埃氏筛质数
void get_prime1(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i])//i不是合数,即i是质数
{
for(int j=i+i;j<=n;j+=i)//i的倍数
st[j]=true;//是合数
cnt++;
}
}
cout<<cnt;
}
//4.线性筛质数
//一个数是合数,用最小质因子可以全部筛掉
void get_prime2(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;//pj不能被i整除,pj就是pj*i的最小质因子
if(i%prime[j]==0)break;//pj能被i整除,pj既是i的最小质因子,也是pj*i的最小质因子
}
}
cout<<cnt;
}
int main()
{
int n;
cin>>n;
get_prime2(n);
}