[C++] Sito Erastotenesa przy użyciu std::list

punk_koper
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 21 maja 2005, o 19:55
Płeć: Mężczyzna
Lokalizacja: Brzeg
Podziękował: 3 razy

[C++] Sito Erastotenesa przy użyciu std::list

Post autor: punk_koper »

Witam, muszę napisać sito Eratostenesa, korzystając z kontenera std::list. Wydawało mi się to stosunkowo proste, program jednak nie działa. Byłbym wdzięczny, gdyby ktoś wskazał błąd w moim kodzie.

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <list>
using namespace std;

int main(int argc, char *argv[])
{   int l,i,k,m,n=2;
    cin >> l;
    list<int> lista;
    for(i=0;i<l;i++)
    {lista.push_back(i+1);}
    for(k=2;k<=sqrt(l);k++)
          {    while(k*n<=l)
             
             lista.remove(k*n);
             n++;                       
          }
    list<int>::iterator iter;
    for(iter=lista.begin(); iter != lista.end(); iter++ )

    cout<<*iter<<" ";
    system("PAUSE");
    return EXIT_SUCCESS;
}
Ostatnio zmieniony 7 lis 2011, o 20:48 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
chlorofil
Użytkownik
Użytkownik
Posty: 548
Rejestracja: 16 cze 2010, o 18:30
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 29 razy
Pomógł: 96 razy

[C++] Sito Erastotenesa przy użyciu std::list

Post autor: chlorofil »

Poprawiony kod:

Kod: Zaznacz cały

void sito(int l)
{   
    int i,k,m,n=2;
    list<int> lista;
    for(i=1;i<l;i++)
    {
        lista.push_back(i+1);
    }
    for(k=2;k<=sqrt((double)l);k++)
    {
        n = 2;
        while(k*n<=l)
        {
            lista.remove(k * n);
            n++;                       
        }
    }
    list<int>::iterator iter;
    for(iter=lista.begin(); iter != lista.end(); iter++)
        cout << *iter << " ";
}
Teraz musisz tylko wywołać tę funkcję w main().

Główny błąd w Twoim kodzie polegał na tym, że zapominałeś o "odnowieniu" zmiennej \(\displaystyle{ n}\) przy usuwaniu kolejnych czynników.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Sito Erastotenesa przy użyciu std::list

Post autor: Afish »

Kod: Zaznacz cały

for(k=2;k<=sqrt(l);k++)
          {    while(k*n<=l)
             
             lista.remove(k*n);
             n++;                       
          }
Brakuje klamry po while'u (w pętli wykonuje się tylko jedna instrukcja), poza tym nigdzie nie jest ustawiana wartość n, przez co jest ona niepoprawna przy kolejnej iteracji pętli for.
Poza tym zamiast math.h dołączaj cmath.
Xitami

[C++] Sito Erastotenesa przy użyciu std::list

Post autor: Xitami »

zamiast

Kod: Zaznacz cały

for(k=2;k<=sqrt((double)l);k++)
ładniej

Kod: Zaznacz cały

for( k=2; k*k <= l; k++ )  // zwykle lepsze niż k<=wcześniej_wyliczony_pierwiastek
zamiast

Kod: Zaznacz cały

n=2; while (...) {...}
eleganciej

Kod: Zaznacz cały

for( n=k*k ; n<=l ; n+=k )  lista.remove(n);
Ostatnio zmieniony 3 gru 2016, o 19:32 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6909
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

[C++] Sito Erastotenesa przy użyciu std::list

Post autor: Mariusz M »

Xitami, problem w tym że w informatyce mamy do czynienia z podzbiorem liczb całkowitych
tj mamy określoną liczbę bitów na których możemy zapisać liczbę całkowitą np
liczba 32 bitowa lub liczba 64 bitowa i dlatego jest dość duże prawdopodobieństwo
że przekroczymy zakres liczby całkowitej zapisując pętlę w ten sposób
ODPOWIEDZ