Pagini recente » Cod sursa (job #454202) | Cod sursa (job #1586318) | Cod sursa (job #435861) | Cod sursa (job #2960202) | Cod sursa (job #1237912)
/*
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;
}