#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<ctype.h>
#include<math.h>
#include<map>
#include<time.h>
using namespace std;
const int N=1e6;
int isprime[N];
int prefixsum[N];
int SQRT=ceil(sqrt((double)N));		//返回大于或者等于指定表达式的最小整数 
int prime()
{
	memset(isprime,1,sizeof(isprime));
	int i;
	isprime[0]=isprime[1]=0;
	for(i=0;i<=SQRT;i++)
	{
		if(isprime[i])
		{
			for(int j=i*i;j<=N;j+=i)
			{
				isprime[j]=0;
			}
		}
	}
}
void maketable()
{
	for(int i=1;i<N;i++)
	{
		prefixsum[i]=isprime[i]?prefixsum[i-1]+1:prefixsum[i-1];
	}
} 
int main()
{
	prime();
	maketable();
//	printf("%.2f\n",(double)clock()/CLOCKS_PER_SEC);
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		printf("%d\n",prefixsum[n]);
	}
	return 0;
}
