Cod sursa(job #1237912)

Utilizator florinpocolPocol Florin florinpocol Data 5 octombrie 2014 09:55:26
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
/*
Codul sursa arata putin urat pentru ca nu lucram direct cu i ci cu 2*i+1,
am mai facut optimizarea ce apare si in mathworld, nu parcurgem numerele
pana la n pentru marcarea multiplilor ci pana la sqrt(n) lucru care
e evident dupa cele explicate mai sus.
Ultima imbunatatire care o vom aduce este aceea de a folosi mai putina memorie.
 Cum pentru fiecare numar e necesara doar o informatie booleana, aceasta o putem
 tine intr-un bit, nu este necesar un char intreg. Sa vedem cum arata codul:

 Documentare pe >>, << , |, & is operati pe biti
            observatie:
                   - daca e i<<1 il inmulteste pe i cu 1
                   - daca e 1<<i il ridica pe 2 la puterea lui i
*/
/*
//class PrimeNumbersSieve5
  final int MAXSIZE = 100000000/2/8+1;
  char[] p = new char[MAXSIZE];

  //(p[i>>3]&(1<<(i&7))) == 0 if 2*i + 1 is prime

  public int getTheNumber(int n) {
    int i, j, nr = 1;
    for (i = 1; ((i * i) << 1) + (i << 1) <= n; i += 1) {
      if ((p[i >> 3] & (1 << (i & 7))) == 0) {
        for (j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= n; j += (i << 1) + 1) {
          p[j >> 3] |= (1 << (j & 7));
        }
      }
    }
    for (i = 1; 2 * i + 1 <= n; ++i)
         if ((p[i >> 3] & (1 << (i & 7))) == 0)
             nr++;
    return nr;
  }*/

#include <fstream>
using namespace std;

//class PrimeNumbersSieve1

  bool p[200001];   int n;
  //p[i] == 0 if i is prime
  int ciur(int n)
  {
    int i, j, nr;

    nr=1;
    for (i = 3; i <= n; i=i+2)
    {
      if (p[i] == 0)
      {
        nr++;
        for (j = i * i; j <= n; j = j+ i)
             // e optimizat pt ca nu e de la i+i daca se iau exeple se va vedea ca pt 5
             //10 a fost marcat de 2 , iar 15 de 3, iar 20 de 2

        {
          p[j] = 1;
        }
      }
    }
    return nr;
  }


int main()
{
    ifstream f("ciur.in");
    ofstream g("ciur.out");
    f>>n;
    g<<ciur(n);

    g.close();
    f.close();
    return 0;
}