Warning Nu esti autentificat. Te rog autentifica-te sau inregistreaza-te pentru a avea acces la toate facilitatile forumului.
SkullBox  
Decembrie 05, 2008, 05:18:43 am
Bine ai venit, Vizitator. Trebuie să te autentifici sau să îţi creezi un cont.
Ai pierdut sau nu ai primit emailul care conţine codul de activare al contului?

Autentifică-te cu numele de utilizator, parola şi precizează durata sesiunii.
Noutăţi: Nebun.SkullBox.info
 
 SkullBoxDirector webTutoriale  Pagina principală   Ajutor Caută Autentificare Creează un cont  
Pagini: [1]
  Imprimă  
Subiect: Ciurul lui Eratostene(det. tuturor nr prime
0Utilizatori şi 1 Vizitatori
AnaKonD
Global Moderator
*
Deconectat Deconectat

Gen: Bărbat
Mesaje: 420


Ciurul lui Eratostene(det. tuturor nr prime, Mai 19, 2007, 10:17:03 am

Nu stiu cat de mult va folosi chestia aceasta unora dintre care probabil stiti deja dar mie mi'a fost de un real folos la probleme si cred ca ar putea fi extins domeniul de aplicatie al acestui algoritm (inca ma gandesc).Sa incepem Smile .

Se da spre exemplu urmatoarea problema:
Citat

Fie n un numar natural(n<=10000).Sa se genereze toate numerele prime mai mici decat n.


Ok.Primul lucru la care m'am gandit cand am auzit chestia asta a fost sa generez toate numerele < n si sa vad daca sunt prime.Dar imediat mi'am dat seama ca este o idee proasta.Pentru 9999 de numere algoritmul ar fi stat o vesnicie(figurativ vb).Apoi am spus ca mai trebuie sa existe si alta cale.Si exista.Se numeste Ciurul lui Eratostene.
Citat

Eratostene a fost un important matematician si filozof al Antichitatii.Desi putine dintre lucraile lui s'au pastrat,a ramas celebru prin metoda rapida de determinare a numerelor prime si prin faptul ca a fost primul care a estimat cu acuratete diametrul Pamantului.


Ideea este de a "pune in ciur" toate numerele mai mici decat n,apoi de a "cerne" aceste numere pana raman in ciur numai numere prime.Mai intai "cernem"(eliminam di ciur) toti multiplii lui 2,apoi multiplii lui 3 s.a.m.d.Vom reprezenta ciurul ca un vector cu 10000 de componente care pot fi 0 sau 1,cu semnificatia ciur=0,daca este in ciur,si 1,altfel(in carte era invers dar ar mai fi necesitat o operatie in plus pt ca vectorul daca l'am declarat global era deja initilizat cu 0;daca am fi pus invers ar fi trebuit sa mai facem si :
Cod:
for(i=0;i ).Haideti sa vedem si algoritmul cum arata :
Cod:

#include

using namespace std;

int i,j,n,k;
int ciur[10000];


int main()
{
    cout<<"Introduceti limita multimii: ";
    cin>>n;

    for(i=2;i<=(n/2);i++)
      for(j=2;(j*i)<=n;j++)
        ciur[j*i]=1;
    for(i=2;i      if(ciur[i]==0)
        cout<    cout<<'n';
    system("PAUSE");
    return 0;
}            



Acesta a fost algoritmul meu facut in Dev-CPP.Cel dat in manual spune asa :
Cod:

#include
#define NMax 10000
int main()
{
  int ciur[NMax],n,i,j;
  cout<<"n= ";
  cin>>n;
  for(i=2;i    ciur[i]=1;
  for(i=2;i*i<=n;i++)
    if(ciur[i])
      for(j=2;j*i         ciur[i*j]=0;
  for(i=2;i    if(ciur[i])
      cout<  return 0;
}


 Iar in cazul in care doriti sa gasiti toate numerele prime dintr'un interval puteti proceda asa:
Cod:

#include

using namespace std;

int a,i,j,n;
int v[10000];


int main()
{
    cout<<"Introduceti intervalele multimii: "<<'n';
    cout<<"Inceput: ";
    cin>>a;
    cout<<"Sfarsit: ";
    cin>>n;

    for(i=a;i<=(n/2);i++)
      for(j=2;(j*i)<=n;j++)
        v[j*i]=1;
    for(i=a;i      if(v[i]==0)
        cout<    cout<<'n';
    system("PAUSE");
    return 0;
}            


De asemeni scris in Dev-CPP.Sper sa va fie de folos Smile .Daca aveti completari,intrebari,observatii,etc  va rog sa le scrieti aici. :thleft:
Memorat

"Sa nu te opresti niciodata din a-ti pune intrebari, curiozitatea sta la baza existentei."(Albert Einstein)
cross the line
AdyX
Bagabond
Global Moderator
*
Deconectat Deconectat

Gen: Bărbat
Mesaje: 1009


WWW
Ciurul lui Eratostene(det. tuturor nr prime, Mai 19, 2007, 11:34:13 am

Poate este cineva interesat si de varianta Pascal a acestui algoritm :whistle:
Cod:

var i, j: word;
      ciur: array[1..64000] of byte;
begin
  writeln('Introduceti limita multimii');
  readln(n);
  for i:=1 to n do
      ciur[i]:=1;
  for i:=2 to n div 2 do
    for j:=2 to n div i do
      ciur[i*j]:=0;
  for i:=3 to n do
    if ciur[i]=1 then
      write(i, ' ');
  readln;
end.

Memorat
SkullAds
Ecspert
ReclAmator
* * * * *
Google AdSense

Gen: Bărbat
Mesaje: Multe

Reclama AdSense,
 

 
   


Pagini: [1]
  Imprimă  
 
Schimbă forumul:  

Creat cu MySQL Creat cu PHP Ethical hacking and programming community Director web romanesc cu inscriere gratuita Validat cu XHTML 1.0! Validat cu CSS!
IPFind, FAQDB, LAMP.ro, Good Proxy, Aberez.EU, RoFreeSBIE, ShockingSoft.com, HostVision, Invatam.net, PC Troubleshooting, Curs valutar online
Powered by SMF 1.1.7 | SMF © 2006-2008, Simple Machines LLC
Traducerea în limba română © 2006-2007 www.smf.ro