Przeczytaj
Zadanie 1. Sumy czynników pierwszych
Marcin od dziecka interesował się liczbami. Gdy w liceum zaczął uczyć się informatyki na poziomie rozszerzonym, chętnie eksplorował różne właściwości liczb. Postanowił wygenerować losowo 200 liczb naturalnych.
W pliku liczby.txt
znajduje się 200 różnych liczb naturalnych o długości od 1 do 6 cyfr, każda w osobnej linii. Liczby należą do przedziału .
Marcin chce się dowiedzieć, ile wynosi suma czynników pierwszych każdej z wygenerowanych przez niego liczb.
Dla każdej liczby z pliku liczby.txt
podaj sumę jej czynników pierwszych. Wynik zapisz w pliku wynik.txt
, każdą sumę w osobnym wierszu, zachowaj kolejność z pliku liczby.txt
.
Gdyby plik liczby.txt
wyglądał następująco:
w pliku wynik.txt
powinny znaleźć się wartości:
Do oceny oddajesz:
plik
wynik.txt
zawierający odpowiedź do zadania (sumy czynników pierwszych liczb z plikuliczby.txt
, każda w osobnej linii, w kolejności zgodnej z plikiemliczby.txt
);plik(i) z komputerową realizacją zadania (kodem programu).
Twoim zadaniem jest opracowanie rozwiązania zadania w wybranym przez siebie języku programowania: C++, Java lub Python. Odpowiedź do zadania dla danych z pliku znajdziesz pod omówieniem algorytmu.
Rozwiązanie:
Rozwiązanie zadania przedstawimy w postaci pseudokodu, ponieważ na egzaminie maturalnym można korzystać z wybranego języka programowania: C++, Java lub Python.
W rozwiązaniu użyjemy algorytmu rozkładu liczby na czynniki pierwsze. Zapiszemy go w funkcji pomocniczej, która będzie zwracała sumę wszystkich znalezionych czynników pierwszych.
Przykładowa funkcja może wyglądać następująco:
Funkcja przyjmuje jako argument
x
[linia kodu 1], oznaczający liczbę do sprawdzenia. Za każdym razem, gdy znajdziemy czynnik pierwszy, będziemy go dodawali do zmiennejsuma
, a samą liczbę dzielili przez niego.Sprawdzamy, czy liczba jest mniejsza od 2, czyli czy ma wartość 0 albo 1 [linia kodu 2]. Jeśli tak, zwracamy 0, ponieważ liczby te nie mają żadnych czynników pierwszych w swoim rozkładzie [linia kodu 3]. W przypadku naszego pliku najmniejsza liczba to 8, ale twój program powinien działać dla dowolnego zestawu danych.
Inicjujemy zmienną
suma
i przypisujemy jej wartość 0 [linia kodu 5].Tworzymy pętlę
dopóki
, która będzie się wykonywać tak długo, dopóki wynik dzieleniax
przez 2 będzie liczbą parzystą [linia kodu 7]. Gdy wynik dzielenia jest liczbą parzystą, do zmiennejsuma
dodajemy 2 [linia kodu 8]. Następnie zmiennejx
przypisujemy wynik dzielenia całkowitegox
przez 2 [linia kodu 9].Następnie szukamy nieparzystych czynników pierwszych. Tworzymy zatem pętlę
dla
[linia kodu 11]. Zaczynamy od liczby 3 i sprawdzamy, czyx
jest przez nią podzielne. Jeśli tak, do zmiennejsuma
dodajemy wartość zmienneji
[linia kodu 13]. Następnie zmiennejx
przypisujemy wynik dzielenia całkowitegox
przezi
. Kontynuujemy działanie pętli dopókix
jest podzielne przez analizowany potencjalny czynnik pierwszy. Następnie zwiększamy sprawdzaną liczbę o 2, ponieważ we wcześniejszej pętli wyeliminowaliśmy wszelkie parzyste czynniki. Powtarzamy procedurę, aż dojdziemy do pierwiastka liczbyx
.Jeżeli po zakończeniu poprzedniej pętli liczba jest wciąż większa od 2 [linia kodu 16], oznacza to, że sprawdzana liczba od samego początku była pierwszapierwsza. Dodajemy ją więc do zmiennej
suma
[linia kodu 17].Na samym końcu zwracamy zmienną
suma
[linia kodu 19].
Wczytujemy liczby z pliku do tablicy [linia kodu 1]. Następnie dla każdej liczby [linia kodu 3] wywołujemy funkcję suma_czynników_pierwszych
oraz wypisujemy wartość zmiennej suma
do pliku wynikowego [linia kodu 5].
Na końcu zamykamy pliki [linie kodu 7 i 8].
W pseudokodzie wykorzystaliśmy operator mod
i div
oraz funkcje całk()
oraz pierwiastek()
:
mod
– operator modulo (oblicza resztę z dzielenia),
div
– operator dzielenia całkowitego,
całk(x)
– zwraca część całkowitą liczbyx
,
pierwiastek(x)
– zwraca pierwiastek kwadratowy liczbyx
.
Odpowiedź
Dla danych z pliku liczby.txt
poprawny plik wynik.txt
wygląda następująco:
Słownik
liczba naturalna większa od 1, mająca tylko dwa dzielniki: 1 oraz siebie samą (takimi liczbami są np.: 2, 3, 5, 7, 11)