Go: package main
import (
	"fmt"
	"os"
	"strconv"
	"bufio"
	//"math"
)

var sc = bufio.NewScanner(os.Stdin)

func main(){
	for sc.Scan(){
		n := nextInt()
		fmt.Println(calc(n))
	}
}

func calc(n int)int{
	// エラトステネスで数え上げる
	// 最初から999999まで用意しておいて入力のたびO(1)で出すのとどっちが速いのかはわからん
	eratos := make([]bool, n+1)
	c := 0
	for i:=2; i<len(eratos); i++{
		if eratos[i] == false{
			c++
			for j:=i*i; j<len(eratos); j+=i{
				eratos[j]=true
			}
		}
	}
	return c
}

func next()string{
	return sc.Text()
}

func nextInt()int{
	a, _ := strconv.Atoi(next())
	return a
}

C++: // IncludingFiles
#include<iostream>
#include<vector>
#include<math.h>

// Defines
#define     MAX_NUMBER     (999999)
#define     MIN_NUMBER     (1)

// Using Namespace
using namespace std;

// Function
int main(){
	vector <int> PrimeNumbers;
	vector <int> input;
	vector <int> output;
	int i,buf,maxn,sz,root;
	bool flag = true;
	int a,b,m,n;

	// 入力
	while(cin >> buf){
		// 入力値のチェック
		if((buf < ((int)(MIN_NUMBER))) || (buf > ((int)(MAX_NUMBER)))){
			cerr << "InputError!!" << endl;
			return -1;
		}
		// 入力値をリストに追加
		input.push_back(buf);
	}

	// n の最大値を求めて maxn に代入
	sz = (int)input.size();
	maxn = input[0];
	for(i=1;i<sz;i++){
		if(maxn < input[i]){
			maxn = input[i];
		}
	}

	// 素数2 を 素数表PrimeNumbers に追加
	PrimeNumbers.push_back(2);

	// 3 から maxn までの整数が素数かどうかを調べ、素数であれば 素数表PrimeNumbers に追加
	for(i=3;i<=maxn;i+=2){
		// root に i の平方根を代入
		root = (int)sqrt(i);
		// sz に 素数表PrimeNumbers の大きさを代入
		sz = (int)PrimeNumbers.size();
		// i が 素数表PrimeNumbers に含まれている素数で割り切れないかを確認
		for(buf=0;buf<sz;buf++){
			if(PrimeNumbers[buf] > root){				// 平方根より大きいならば
				break;						// 内側のforループから抜ける
			}else if((i % PrimeNumbers[buf]) == 0){			// もし割り切れたら
				flag = false;					// flag を戻して
				break;						// 内側のforループから抜ける
			}
		}
		// flag が立っている (すなわち i は素数である) ならば i を 素数表PrimeNumbers に追加
		if(flag == true){
			PrimeNumbers.push_back(i);
		}
		// flag を元の状態に戻す (立てる)
		flag = true;
	}

	// n 以下の素数の個数を計測
	sz = (int)input.size();
	for(i=0;i<sz;i++){
		// a および flag の初期化
		a = 0;
		flag = false;

		// b の初期化
		b = (int)PrimeNumbers.size();

		// PrimeNumbers の最大値 <= input[i] となっていないかどうかを調べる
		if(PrimeNumbers[b-1] <= input[i]){
			n = b - 1;
			flag = true;
		}

		// 二分検索
		while (flag == false){
			m = (a + b) / 2;
			if(PrimeNumbers[m] > input[i]){
				b = m;
			}else if((PrimeNumbers[m] <= input[i]) && (PrimeNumbers[m+1] > input[i])){
				n = m;
				flag = true;
			}else if(PrimeNumbers[m] < input[i]){
				a = m;
			}else{
				cerr << "BinarySearchError!!" << endl << endl;
				cerr << "PrimeNumbers[" << m << "] = " << PrimeNumbers[m] << endl;
				cerr << "PrimeNumbers[" << (m + 1) << "] = " << PrimeNumbers[m+1] << endl;
				cerr << "input[" << i << "] = " << input[i] << endl;
				return -1;
			}
		}

		// 出力値をリストに追加
		output.push_back(n + 1);
	}

	// 出力
	sz = (int)output.size();
	for(i=0;i<sz;i++){
		cout << output[i] << endl;
	}

	return 0;
}

C++: #include <iostream>
#include <cmath>

using namespace std;

bool isPrime(int n) {
    if (n < 2) {
        return false;
    }
    else if (n == 2) {
        return true;
    }
    else if(n%2 == 0) {
        return false;
    }
    
    double num = sqrt(n);
    for (int i = 3; i <= num; i += 2) {
        if (n%i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    int n;
    int cnt;
    while(cin >> n) {
        cnt = 0;
        for (int i = 2; i <= n; i++) {
            cnt += isPrime(i);
        }
        cout << cnt << endl;
    }
    return 0;
}

C++: #include<stdio.h>

int main(void){
  int n;
  while(scanf("%d",&n)!=EOF){
    if(n==1){
      printf("%d\n",0);
      break;
    }
    int p[50000];
    p[0]=2;
    int pi=1;
    int i=2;
    while(i<=n){
      int t=1;
      int j;
      for(j=0;j<pi;j++){
	if(i%p[j]==0){
	  t=0;
	  break;
	}
      }
      if(t==1){
	p[pi]=i;
	pi++;
      }
      i++;
    }
    printf("%d\n",pi);
  }
  return 0;
}

C++: #include <iostream>
#include <vector>
#include <set>
#include <cmath>

std::vector<int> PRIMES;

void init_primes(int max)
{
  if (max < 2) return;
  std::set<int> candidate;
  PRIMES.push_back(2);
  for (int i = 3; i < max; i+=2) {
    candidate.insert(i);
  }
  for (int i = 3; i < sqrt(max); i+=2) {
    std::set<int>::iterator it = candidate.find(i);
    if (it != candidate.end()) {
      PRIMES.push_back(i);
      int del_num = i;
      while (del_num < max) {
        it = candidate.find(del_num);
        if (it != candidate.end()) candidate.erase(it);
        del_num += i;
      }
    }
  }
  for (std::set<int>::iterator it = candidate.begin();
       it != candidate.end(); ++it) {
    PRIMES.push_back(*it);
  }
}

int main()
{
  const int max = 1000;
  init_primes(max);
  int i;
  while (std::cin >> i) {
    std::vector<int>::iterator it = PRIMES.begin();
    int n = 0;
    while (*it <= i) {
      n++;
      it++;
    }
    std::cout << n << std::endl;
  }
}

C++: // 2012/11/07 Tazoe

#include <iostream>
using namespace std;

int main()
{
	bool is_prime[1000000];

	is_prime[0] = is_prime[1] = false;
	for(int i=2; i<1000000; i++){
		is_prime[i] = true;
	}

	for(int i=2; i*i<1000000; i++){
		if(is_prime[i]){
			for(int j=i*i; j<1000000; j+=i){
				is_prime[j] = false;
			}
		}
	}

	int n_prime[1000000];

	int cnt = 0;
	for(int i=0; i<1000000; i++){
		if(is_prime[i]){
			cnt++;
		}

		n_prime[i] = cnt;
	}

	while(true){
		int n;
		cin >> n;

		if(cin.eof())
			break;

		cout << n_prime[n] << endl;
	}

	return 0;
}

C++: #include <iostream>

using namespace std;
 
int main(void)
{
  int input;
  while(cin >> input)
  {
  bool isPrime[input];
  // if the index 0 do not count as the prime number
  isPrime[0] = false;
  /// if the index 1 do not count as the prime number
  isPrime[1] = false;
  // if the index 2 count as the prime number
  isPrime[2] = true;
  
	for(int i = 3; i <= input; i += 2)
    		isPrime[i] = true;
  	
	for(int i = 3; i * i <= input; i += 2)
   		 for(int j = i * i; j <= n; j += i)
     		 isPrime[j] = false;
  		 for(int i = 4; i <= n; i += 2)
    		 isPrime[i] = false;
  
	int count = 0;
 	

	for(int i = 0; i <= input; i++)
    	
	if(isPrime[i])
    	{
     	 count++;
      
    	}
  	cout << count << endl;
  }
}

C++: #include<stdio.h>
int n;
int num[1000000]={0};
int ans=0;

int del(int x){
    for(int i=x;i<999999;i++){
        if(i%x==0){
            num[i]=1;
        }
    }
    return 0;
}

int main(){
    while(scanf("%d",&n)!=-1){
        for(int i=0;i<999999;i++){
            num[i]=0;
        }
        ans=0;
        for(int i=1;i<n+1;i++){
            if(i==1){

            }
            else if(num[i]==0){
                ans++;
                del(i);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

C++: #include<iostream>
#include<string>
#include <stdio.h>
#include <math.h>
#include <cctype>
#include<queue>
#include<stack>
#include<cstdio>
#include <algorithm>
#include <cstdio>
using namespace std;
int main(){
	int n;
	while(cin>>n){
		int ans=0;
		int d[999999+100]={};
		for(int i=2;i*i<=n;i++){
			if(d[i]==0){
				for(int j=2;j*i<=n;j++){
					d[j*i]++;
				}
			}
		}
		d[1]=1;
		for(int i=1;i<=n;i++){
					if(d[i]==0){
						ans++;
					}
							}
			cout<<ans<<endl;

		}
		
		return 0;
}

C++: #include <iostream>

using namespace std;

int main(){
  int n,visited,cnt=0;
  
  while(cnt<30){
    int count =0;
    cnt++;
    cin >> n;
    if(n==0)count =0;
    for(int j=2;j<=n;j++){
      visited=0;
      for(int i = 2;i<=n;i++){
	
	if(j%i==0&&j!=i)visited=1;
	else if(j%i==0&&j==i&&visited==0)count++;
	/*	cout<<"j/"<<j<<" i:"<<i <<" count:"<<count<<" visited"<<visited<<endl;    */ 
      }
    }
    cout << count << endl;
  }
  return 0;
}