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.txtzawierają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ą
sumai przypisujemy jej wartość 0 [linia kodu 5].Tworzymy pętlę
dopóki, która będzie się wykonywać tak długo, dopóki wynik dzieleniaxprzez 2 będzie liczbą parzystą [linia kodu 7]. Gdy wynik dzielenia jest liczbą parzystą, do zmiennejsumadodajemy 2 [linia kodu 8]. Następnie zmiennejxprzypisujemy wynik dzielenia całkowitegoxprzez 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, czyxjest przez nią podzielne. Jeśli tak, do zmiennejsumadodajemy wartość zmienneji[linia kodu 13]. Następnie zmiennejxprzypisujemy wynik dzielenia całkowitegoxprzezi. Kontynuujemy działanie pętli dopókixjest 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)