#include <iostream>
#include <cstdlib>
#include <math.h>
#include <new>
using namespace std;
struct Prim //struktura z jedna liczba
{
int x; //wartosc podanej liczby
bool status; //status: true - liczba pierwsza, false - nie liczba pierwsza
Prim *next; //wskaznik na nastêpny element listy
};
int main()
{
int n,i,j,maxi;
Prim *head = NULL; //deklaracja glowy i nadanie jej adresu zerowego
Prim *tail = NULL; //deklaracja ogona i nadanie jej adresu zerowego
Prim *nowy;
cout<<"Podaj zakres liczb ";
cin>>n;
for(i=2; i<=n; i++) //tworzy liste
{
nowy=new Prim; //tworzenie nowego obiektu typu prim
nowy->next=NULL; //nastepny element wskazuje na NULL
nowy->x=i; //nadanie wartosci liczby takiej jaka jest w danej iteracji
nowy->status=true; //domyslnie kazda liczba ma status true
if(head==NULL)//sprawdza czy zostal juz utworzony pierwszy element listy
{
head=nowy; //glowa przyjmuje adres pierwszego elementu
tail=head; //ogon tez wskazuje na pierwszy element, bo to jest pierwszy element listy
}
else
{
tail->next=nowy; //jesli lista zawiera juz pierwszy element, ogonowi dajemy wskaznik nastepnego elementu
tail=nowy;
}
}
maxi=sqrt(n); //tworzenie warunku stopu, czyli do jakiej liczby ma sie wykonywac algorytm sita
Prim *wsk=head;
//pomocniczy wskaznik do przeszukiwania listy
for(i=2; i<=maxi; i++){ //iteracja wykonuje się tylko dla wielokrotnosci liczb nie wiekszych od maxi
if(wsk->status==true){
Prim *wsk2=wsk;
for(j=2*i;j<=n;j++){
if(j%i==0){
wsk2=wsk2->next;
wsk2->status=false;
cout<<wsk2->x<<endl;
}
else wsk2=wsk2->next;
cout<<"W elsie: "<<j<<endl;
}
}
wsk=wsk->next;
}
Prim *temp=head; //poczatek wyswietlania elementow listy
cout<<"Liczby pierwsze z danego przedzialu to:"<<endl;
while(temp!=NULL){ //wyswietlanie elementow listy ze statusem true
if(temp->status==true){
cout<<temp->x<<endl;
temp=temp->next;
}
else temp=temp->next;
}
return 0;
}