Cod sursa(job #509716)

Utilizator liviu12345Stoica Liviu liviu12345 Data 11 decembrie 2010 16:55:21
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <cstdio>
#include <cstdlib>

using namespace std ;

bool ciur [2000001] ;

int inline sqrt ( int X )
{
  int St = 1 , Dr = X , mid ;
  while ( ( Dr - St ) > 1 )
  {
    mid = ( St + Dr ) >> 1 ;
    if ( ( mid * mid ) > X )
      Dr = mid ;
    else
      St = mid ;
  }
  return Dr ;
}

int main ( )
{
  freopen ( "ciur.in" , "r" , stdin ) ;
  freopen ( "ciur.out" , "w" , stdout ) ;
  int N , K = 0 , L ;
  register int i ;
  scanf ( "%d" , &N ) ;
  int Stop = sqrt ( N ) ;
  Stop = ( N > Stop ) ? 1 : N ;
  for ( i = 4 ; i <= N ; i += 2 )
    ciur [ i ] = true ;
  ++K ;
  for ( i = 3 ; i <= N ; i += 2 )
  {
    if ( ciur [ i ] )
      continue ;
    L = 2 * i ;
    for ( long long j = i * i ; j <= N ; j += L )
      ciur [ j ] = true ;
    ++K ;
  }
  printf ( "%d" , K ) ;
}