Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sito Eratostenesa objektowo

Ostatnio zmodyfikowano 2017-03-18 23:20
Autor Wiadomość
Beorn
Temat założony przez niniejszego użytkownika
Sito Eratostenesa objektowo
» 2017-03-18 12:17:54
Mam zadanie z programowania ale nie wiem jak go ugryźć :/



Proszę napisać klasę służącą do generowania liczb pierwszych z zadanego zakresu (1...n). Liczby należy generować za pomocą sita Erastotenesa

http://www.math.edu.pl/sito-eratostenesa

Klasa ta powinna posiadać następujące metody:


    konstruktor określający górną granicę ; konstruktor alokuje i inicjuje tablicę odpowiednich rozmiarów
    destruktor zwalniający zaalokowaną tablicę - czy jest potrzebny?
    metodę Odsiej() usuwającą z przygotowanej w konstruktorze tablicy liczby złożone
    metodę Wyswietl() wyświetlającą wszystkie liczby pierwsze z zakresu 1...n
    metodę Sprawdz(x) - sprawdzającą, czy liczba x jest liczbą pierwszą; uwaga - jeśli wcześniej wywołano metodę Odsiej(), to sprawdzenie powinno mieć złożoność O(1) dla x z zakresu 1...n


Po stworzeniu obiektu Sito wszystkie publiczne metody udostępniane przez tą klasę powinny "działać"
Przykład:

// "naturalny" porządek algorytmu: stworz -> odsiej -> sprawdz

Sito s1 = new Sito(20);
s1->Sprawdz(7); // co teraz? przecież nie zostało jeszcze odsiane


Z objektówką dopiero zaczynam i jakby tego było mało to zawsze miałem problem z alokacją dynamiczną.
Zaczynając od początku chyba powinienem brać się za konstruktor ale nie bardzo wiem jak on miałby wyglądać mógłby ktoś pomóc?
P-159085
mateczek
» 2017-03-18 13:10:31
C/C++
class sito {
    bool odsiane;
    int zakres;
public:
    sito( int _zakres ) {
        zakres = _zakres;
        odsiane = false;
    }
    void odsiej() {
        odsiane = true;
    }
    void sprawdz( int liczba ) {
        if( !odsiane ) odsiej();
       
    }
}
P-159087
Beorn
Temat założony przez niniejszego użytkownika
» 2017-03-18 14:39:27
A co z tablicą?
jak mam odsiać liczby złożone skoro nie mam tablicy w klasie?
P-159090
mateczek
» 2017-03-18 21:01:00
chcesz gotowy kod??
C/C++
#include <iostream>
class sito {
    bool odsiane;
    int zakres;
    bool * tablica;
public:
    sito( int _zakres ) {
        zakres = _zakres;
        odsiane = false;
        tablica = new bool[ zakres + 1 ];
        for( int i = 1; i <= zakres; i++ ) tablica[ i ] = true;
       
    }
    void odsiej() {
        odsiane = true;
        tablica[ 1 ] = false;
        for( int i = 2; i <= zakres; i++ ) {
            int index = i + i;
            while( index <= zakres ) {
                tablica[ index ] = false;
                index = index + i;
            }
        }
       
    }
    void sprawdz( int liczba ) {
        if( !odsiane ) odsiej();
       
        if( tablica[ liczba ] ) {
            std::cout << "jest liczba pierwsza" << std::endl;
        } else {
            std::cout << "to jest liczba druga" << std::endl;
        }
    }
    void wypisLiczbyPierwsze() {
        if( !odsiane ) odsiej();
       
        for( int i = 1; i <= zakres; i++ ) {
            if( tablica[ i ] ) std::cout << i << " ";
           
        }
    }
};

int main() {
    sito s( 78 );
    s.wypisLiczbyPierwsze();
    std::cout << std::endl;
    std::cout << "liczba 33 ";
    s.sprawdz( 33 );
}
P-159127
mokrowski
» 2017-03-18 23:20:45
@mateczek "bądź człowiek" i pokaż mu destruktor i listy inicjalizacyjne ... bo cieknie teraz :-/
P-159138
« 1 »
  Strona 1 z 1