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 <8, 999951>.

R1Tnrjgc3cdol

Przycisk do pobrania pliku TXT zawierający treść zadania.

Plik TXT o rozmiarze 1.51 KB w języku polskim

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.

Przykład 1

Gdyby plik liczby.txt wyglądał następująco:

Linia 1. 420. Linia 2. 69. Linia 3. 88.

w pliku wynik.txt powinny znaleźć się wartości:

Linia 1. 19. Linia 2. 26. Linia 3. 17.

Do oceny oddajesz:

  • plik wynik.txt zawierający odpowiedź do zadania (sumy czynników pierwszych liczb z pliku liczby.txt, każda w osobnej linii, w kolejności zgodnej z plikiem liczby.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:

Linia 1. funkcja suma podkreślnik czynników podkreślnik pierwszych otwórz nawias okrągły x zamknij nawias okrągły dwukropek. Linia 2. jeżeli x otwórz nawias ostrokątny 2 dwukropek. Linia 3. zwróć 0. Linia 5. suma ← 0. Linia 7. dopóki x mod 2 znak równości 0 dwukropek. Linia 8. suma ← suma plus 2. Linia 9. x ← x div 2. Linia 11. dla i znak równości 3 przecinek 5 przecinek kropka kropka kropka przecinek całk otwórz nawias okrągły pierwiastek otwórz nawias okrągły x zamknij nawias okrągły plus 1 zamknij nawias okrągły dwukropek. Linia 12. dopóki x mod i znak równości 0 dwukropek. Linia 13. suma ← suma plus i. Linia 14. x ← x div i. Linia 16. jeżeli x zamknij nawias ostrokątny 2 dwukropek. Linia 17. suma ← suma plus x. Linia 19. zwróć suma.
  • 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 zmiennej suma, 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 dzielenia x przez 2 będzie liczbą parzystą [linia kodu 7]. Gdy wynik dzielenia jest liczbą parzystą, do zmiennej suma dodajemy 2 [linia kodu 8]. Następnie zmiennej x przypisujemy wynik dzielenia całkowitego x 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, czy x jest przez nią podzielne. Jeśli tak, do zmiennej suma dodajemy wartość zmiennej i [linia kodu 13]. Następnie zmiennej x przypisujemy wynik dzielenia całkowitego x przez i. Kontynuujemy działanie pętli dopóki x 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 liczby x.

  • 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 pierwszaliczba pierwszapierwsza. Dodajemy ją więc do zmiennej suma [linia kodu 17].

  • Na samym końcu zwracamy zmienną suma [linia kodu 19].

Linia 1. liczby otwórz nawias kwadratowy 0 kropka kropka 199 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów liczby kropka txt cudzysłów. Linia 3. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 199 wykonuj dwukropek. Linia 4. suma ← suma podkreślnik czynników podkreślnik pierwszych otwórz nawias okrągły liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 5. dopisz suma do pliku “wynik kropka txt cudzysłów. Linia 7. zamknij plik cudzysłów wynik kropka txt cudzysłów. Linia 8. zamknij plik cudzysłów liczby kropka txt cudzysłów.

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].

Ważne!

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ą liczby x,

  • pierwiastek(x) – zwraca pierwiastek kwadratowy liczby x.

Odpowiedź

Dla danych z pliku liczby.txt poprawny plik wynik.txt wygląda następująco:

RfajcQQyPBwpe

Przycisk do pobrania pliku TXT z wynikiem zadania.

Plik TXT o rozmiarze 1.15 KB w języku polskim

Słownik

liczba pierwsza
liczba pierwsza

liczba naturalna większa od 1, mająca tylko dwa dzielniki: 1 oraz siebie samą (takimi liczbami są np.: 2, 3, 5, 7, 11)