Matura informatyka zbiór zadań. Zadanie 60 - Dzielniki.

Kliknij i wspomóż mnie :)

Python

Każdy przygotowywujący się do matury z informatyki spotyka się z różnymi zadaniami w języku c++. Obecnie coraz więcej szkół zaczyna korzystać z Python'a, a ja chcę w tej serii pokazać jak rozwiązywać przykładowe zadania.

Arkusz z zadaniami (Matura Zbiór zadań Informatyka) możesz znaleźć pod tym linkiem:

Matura Zbiór zadań Informatyka

Kod źródłowy do zadania wraz z plikami znajdziesz tutaj:

Github

Wczytywanie danych

Tyle słowem wstępu. Zobaczmy jak wygląda polecenie. W pliku liczby.txt danych jest 200 różnych liczb całkowitych z przedziału [2, 1 000 000], każda w osobnym wierszu pliku. Napisz program (lub kilka programów), który poda odpowiedzi do poniższych zadań

Po przeczytaniu tego polecenia możemy zacząć pisać nasz kod. Pierwsze co trzeba zrobić to wczytać dane z pliku.

W powyższym kodzie najpierw deklarujemy nowa listę. Następnie za pomocą with otwieramy plik liczby.txt.

Wczytane dane jednak nie są w żaden sposób sformatowane, stąd trzeba odpowiednio dostosować liczby do naszego kodu.

Metodą readlines() odczytuję linie z objektu. W innym przypadku wypisanie samego obiektu data daje taki rezultat:

Kiedy mamy już zczytaną linijkę po linijce możemy metodą strip() wyrzucić śmieci takie jak spację lub znaki końca lini '\n'.

Przedostatnia linijka to już proste rzutowanie na objekt liczbowy. Musimy o tym pamiętać, gdyż liczby są wczytywane są z pliku txt. Warto to zrobić tutaj i zawsze pracować na obiektach typu Int.

Filtrowanie danych

Policz, ile jest w pliku wejściowym liczb mniejszych niż 1000, oraz podaj dwie takie liczby, które pojawiają się w pliku jako ostatnie (możesz założyć, że będą co najmniej dwie).

Pierwszy podpunkt typowo na rozgrzewkę. Musimy porównać liczby oraz wypisać dwie ostatnie. Zobaczmy jak wygląda kod.

W pierwszej linijce używamy już napisanej funkcji do odczytania danych. Nad drugą warto się jednak pochylić i wytłumaczyć. funkcja lamda pobiera liczbę z numbs (w lamdzie to 'x') i porównuje obiekt.

Jeśli obiekt spełnia warunek to lambda 'mówi' metodzie filter(), że może dodać element do listy.

Na samym końcu otrzymane liczby opakowywjemy za pomocą metody list(), tak by utworzyć obiekt i operować na nim.

Więcej o filtrowaniu danych w języku Python możesz przeczytać na bardzo czytelnej stronie o tutaj:

Map, Filter and Reduce

Póżniej wystarczy nam już tylko wyciągnąć dwa ostatnie elementy z odfiltrowanych liczb. Robimy to operując na indeksach tablicy. -1 oznacza, że będziemy wypisywać od końca, a jako, że wypisujemy dwa elementy to zakończymy na pozycji -3.

Wyszukiwanie dzielników

Wśród liczb występujących w pliku wejściowym znajdź te, które mają dokładnie 18 dzielników naturalnych (wliczając w nie 1 i samą liczbę). Dla każdej znalezionej liczby wypisz, oprócz jej wartości, listę wszystkich jej dzielników, posortowaną rosnąco.

Drugie zadanie wymaga już trochę więcej wysiłku oraz odnosi się do dzielników, stąd warto użyć napisanej wcześniej funkcji.

W tym przykładzie idealnie pasuje użycie obiektu w Python'ie jakim jest słownik (dictionary). Pozwala on przypisać obiektowi (klucz) inny obiekt (wartość), a jednocześnie iterować jak po liście.

Trzecia linijka od końca wyraża przypisanie kluczowi, w tym przypadku liczba, listę z jej dzielnikami. Jak możesz zauważyć funkcja findDividersOf() zwraca już posortowane dzielniki, więc wszystkie wymagania zadania są spełnione.

Liczby pierwsze

Znajdź największą liczbę w pliku, która jest względnie pierwsza ze wszystkimi pozostałymi, czyli taką, która z żadną z pozostałych liczb nie ma wspólnego dzielnika innego niż 1.

W tym zadaniu musimy znaleźć wszystkie liczby względnie pierwsze oraz wybrać z nich tą największą. Sprawdźmy jak wygląda kod.

Kolejne linijki zajmują się 'przesianiem' danych. Jeżeli są one podzielne przez 2 lub 3 to lambda nie doda ich do nowej listy. Ten zabieg ma na celu trochę przyspieszyć program.

Warto zauważyć, że w 4 linijce operujemy na już przefiltrowanych danych. Taki zabieg mocno zmniejsza ilość liczb, które trzeba porównać.

Pierwsza pętla iteruje po pozostałych liczbach.

Druga pętla (ta zagnieżdżona) sprawdza czy są jeszcze jakieś liczby mające dzielniki w przedziale od 10 do 100.

Jeżeli liczba miała jakiś inny dzielnik to licznik dividers zwiekszamy o jeden.

Wartość dividers inna niż 0 nie pozwoli dodać liczby do listy primaryNumbers.

Ostatnia linijka to wyszukanie najwiekszej liczby w primaryNumbers za pomocą metody max() i wypisanie.

Teraz wystarczy już tylko wywołać funkcje i przetestować działanie.

Dziękuję Ci za przeczytanie tego materiału 😀 Jeżeli spodobało Ci się to o czym piszę, możesz sprawdzić więcej materiałów na blogu lub udostępnić znajomym. Będzie mi bardzo miło 😊

O mnie

Jestem młodym programistą, który dumnie dzierży wiele pasji takich jak bieganie czy piwowarstwo domowe. Jedną z nich jest także programowanie i o tym właśnie zamierzam tutaj pisać.

Zobacz więcej

Najnowsze posty

Zostańmy w kontakcie

* Wymagane
Kliknij i wspomóż mnie :)
shop
Otwórz Sklep Play

Zachęcam Cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.