Skip to main content

Command Palette

Search for a command to run...

Matura informatyka 2022 maj (poziom rozszerzony) - zadanie 4.2

Updated
2 min read
Matura informatyka 2022 maj (poziom rozszerzony) - zadanie 4.2

Treść zadania:

Znajdź w pliku liczby.txt:

  • liczbę, która ma w rozkładzie najwięcej czynników pierwszych (podaj tę liczbę oraz liczbę jej czynników pierwszych)

  • liczbę, która ma w rozkładzie najwięcej różnych czynników pierwszych (podaj tę liczbę oraz liczbę jej różnych czynników pierwszych).

Przykład: liczba 420=2·2·3·5·7 ma w rozkładzie 5 czynników pierwszych, w tym 4 różne czynniki pierwsze (2, 3, 5, 7).

Odpowiedź dla danych z pliku przyklad.txt: 144 6 210 4

(Liczba 144 ma najwięcej czynników pierwszych; liczba czynników pierwszych liczby 144 wynosi 6. Liczba 210 ma najwięcej różnych czynników pierwszych; liczba różnych czynników pierwszych liczby 210 wynosi 4).

Rozwiązanie:

Odczytujemy dane z pliku i konwertujemy je na int'y:

with open("dane/liczby.txt", "r") as f:
    nums = [int(num) for num in f.readlines()]

Następnie definiujemy funkcję get_prime_factors , której zadaniem jest zwrócenie listy czynników pierwszych

def get_prime_factors(n: int) -> list[int]:
    current_divider = 2
    factors = []
    while n > 1:
        if n % current_divider == 0:
            factors.append(current_divider)
            n = n / current_divider
        else:
            current_divider += 1

    return factors

Jej działanie opiera się na podobieństwie z sitem Eratostenesa. Więcej o algorytmie możesz przeczytać tutaj.

Z treści zadania wynika:

W pliku liczby.txt danych jest 200 różnych liczb całkowitych z zakresu [10, 100000]. Każda z tych liczb zapisana jest w osobnym wierszu. , że liczby są w zakresie [10, 100000], więc można bezpiecznie założyć, że naszymi minimami mogą być 0 i puste listy:

prime_factors = 0
prime_factors_list = []

unique_prime_factors = 0
unique_prime_factors_list = []

Dla każdej liczby wyznaczamy jej listę czynników pierwszych i tą listę bez duplikatów. Kolejne linijki sprowadzają się do porównania z poprzednimi wynikami i wypisaniem ich na ekran:

for num in nums:
    prime_factors_result = get_prime_factors(num)
    unique_prime_factors_result = set(prime_factors_result)
    if len(prime_factors_result) > len(prime_factors_list):
        prime_factors = num
        prime_factors_list = prime_factors_result
    if len(unique_prime_factors_result) > len(unique_prime_factors_list):
        unique_prime_factors = num
        unique_prime_factors_list = unique_prime_factors_result

print(f"{prime_factors} {len(prime_factors_list)}")
print(f"{unique_prime_factors} {len(unique_prime_factors_list)}")

Cały program:

with open("dane/liczby.txt", "r") as f:
    nums = [int(num) for num in f.readlines()]

def get_prime_factors(n: int) -> list[int]:
    current_divider = 2
    factors = []
    while n > 1:
        if n % current_divider == 0:
            factors.append(current_divider)
            n = n / current_divider
        else:
            current_divider += 1

    return factors

prime_factors = 0
prime_factors_list = []

unique_prime_factors = 0
unique_prime_factors_list = []

for num in nums:
    prime_factors_result = get_prime_factors(num)
    unique_prime_factors_result = set(prime_factors_result)
    if len(prime_factors_result) > len(prime_factors_list):
        prime_factors = num
        prime_factors_list = prime_factors_result
    if len(unique_prime_factors_result) > len(unique_prime_factors_list):
        unique_prime_factors = num
        unique_prime_factors_list = unique_prime_factors_result

print(f"{prime_factors} {len(prime_factors_list)}")
print(f"{unique_prime_factors} {len(unique_prime_factors_list)}")

Wynik:

99792 10
62790 6

Źródło: https://arkusze.pl/matura-informatyka-2022-maj-poziom-rozszerzony/

More from this blog

matura z infy

17 posts