Sito Eratostenesa objektowo
Ostatnio zmodyfikowano 2017-03-18 23:20
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? |
|
mateczek |
» 2017-03-18 13:10:31 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(); } } |
|
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? |
|
mateczek |
» 2017-03-18 21:01:00 chcesz gotowy kod?? #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 ); } |
|
mokrowski |
» 2017-03-18 23:20:45 @mateczek "bądź człowiek" i pokaż mu destruktor i listy inicjalizacyjne ... bo cieknie teraz :-/ |
|
« 1 » |