Matura informatyka grudzień 2024, zadanie 3 (liczby czterocyfrowe) — rozwiązanie

Kwadraty, czynniki pierwsze i rutyna Kaprekara. Gotowe odpowiedzi do wszystkich trzech podpunktów plus wyjaśnienie, dlaczego w 3.3 może wyjść tylko jedna liczba.

Trzy niezależne podpunkty na tym samym pliku. Najciekawszy jest ostatni — prowadzi do liczby 6174, i nie jest to przypadek.

Arkusz CKE — grudzień 2024, test diagnostyczny, rozszerzony

Zadanie 3.1 — kwadraty liczb całkowitych

Liczba jest kwadratem, jeśli jej pierwiastek całkowity podniesiony do kwadratu daje ją z powrotem.

import math

def jest_kwadratem(n):
    r = math.isqrt(n)
    return r * r == n

Kontrola na liczby_przyklad.txt: 2 kwadraty, pierwszy 9801

Odpowiedź dla liczby.txt: 20 kwadratów, pierwszy 4489

Zadanie 3.2 — co najmniej 5 różnych czynników pierwszych

def liczba_roznych_pierwszych(n):
    c = 0
    d = 2
    while d * d <= n:
        if n % d == 0:
            c += 1
            while n % d == 0:    # wyrzuć cały ten czynnik
                n //= d
        d += 1
    if n > 1:                    # został duży czynnik pierwszy
        c += 1
    return c

Kontrola na liczby_przyklad.txt: jedna taka liczba, 2730

Odpowiedź dla liczby.txt:

2730, 8190, 2310, 4620, 7770, 8610, 4830, 4290, 6930, 6630

Najmniejsza czterocyfrowa liczba z pięcioma różnymi czynnikami pierwszymi to 2730 = 2·3·5·7·13, czyli iloczyn pięciu najmniejszych liczb pierwszych. Pięć różnych czynników to sporo jak na cztery cyfry — stąd tak krótka lista.

Zadanie 3.3 — rutyna Kaprekara

Z cyfr liczby układasz największą i najmniejszą możliwą liczbę (zera traktujesz jak każdą inną cyfrę) i odejmujesz.

def roznica_kaprekara(n):
    cyfry = f"{n:04d}"
    najw = int("".join(sorted(cyfry, reverse=True)))
    najm = int("".join(sorted(cyfry)))
    return najw - najm

Dla 3151: 5311 − 1135 = 4176. Dla 2047: 7420 − 0247 = 7173.

Kontrola na liczby_przyklad.txt: 8 mniejszych, 12 większych, 0 równych

Odpowiedź dla liczby.txt: 947 mniejszych, 1052 większych, 1 równa — i tą równą jest 6174

Dlaczego akurat 6174

To stała Kaprekara. Weź dowolną liczbę czterocyfrową, której cyfry nie są wszystkie takie same, i powtarzaj tę samą operację. Po najwyżej siedmiu krokach zawsze wylądujesz na 6174 i tam utkniesz, bo 7641 − 1467 = 6174 w kółko.

Odkrył to indyjski matematyk D.R. Kaprekar w 1949 roku. 6174 jest jedyną czterocyfrową liczbą będącą swoim własnym wynikiem — dlatego w całym pliku „równa" może być tylko ona.

Gdzie tracisz punkty

  • sqrt zamiast isqrt w 3.1. sqrt zwraca float, a porównywanie liczb zmiennoprzecinkowych przy większych wartościach potrafi spłatać figla. isqrt liczy na intach i nie kłamie.
  • Zapomniany duży czynnik w 3.2. Po pętli może zostać n > 1 — to jest czynnik pierwszy większy od pierwiastka i trzeba go doliczyć.
  • Brak wiodących zer w 3.3. f"{n:04d}" jest tu istotne. Bez tego liczba w rodzaju 2047 zgubi zero przy układaniu najmniejszej.
  • Niewyrzucenie całego czynnika. Wewnętrzna pętla while n % d == 0 musi wyrzucić wszystkie kopie dzielnika, inaczej policzysz go kilka razy.

Ten sam wzorzec w innych arkuszach

Rozbiór liczby na cyfry i klasyka „liczb" — dzielniki, NWD, liczby pierwsze — wracają w niemal każdym arkuszu:

Z tego samego arkusza: zad. 1 (pozycje jedynek).


Nazwisko Kaprekara wraca w arkuszach więcej niż raz, w różnych przebraniach. To dobry przykład tego, jak bardzo te zadania się powtarzają — cała mapa w Variancie.

Wariant — kurs maturalnyKup kurs