Matura 2019: Zadanie 4

Arkusz i pliki wymienione w tym zadaniu można pobrać ze strony CKE.
Bezpośredni link do plików znajduje się tutaj.

Zadania

W pliku liczby.txt zapisano 500 liczb całkowitych dodatnich po jednej w każdym wierszu. Każda liczba jest z zakresu od 1 do 100 000.

Napisz program(-y) dający(-e) odpowiedzi do poniższych zadań. Zapisz uzyskane odpowiedzi w pliku wyniki4.txt, poprzedzając każdą z nich numerem odpowiedniego zadania.

Uwaga: Plik przyklad.txt zawiera przykładowe dane spełniające warunki zadania. Odpowiedzi dla danych z tego pliku są podane pod treściami zadań.

W każdym rozwiązaniu zakładam, że pliki z danymi maturalnymi są umieszczone w jednym folderze, wraz z plikiem z rozwiązaniem do zadania 4.

Zadanie 4.1

Podaj, ile z podanych liczb jest potęgami liczby 3, czyli liczbami postaci 1 = 30 , 3 = 31 , 9 = 32 .

Dla pliku przyklad.txt odpowiedź wynosi 2.

Rozwiązanie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for i in range(12):
    potegi_3.append(3 ** i)

licznik = 0

plik = open('liczby.txt', 'r')
lista = plik.readlines()
plik.close()
liczby = [i.rstrip('\n') for i in lista]

for i in liczby:
    for dzielnik in potegi_3:
        if i == dzielnik:
            licznik += 1

wynik_1 = licznik

plik = open("wyniki4.txt", "w")
plik.writelines("4.1: {}\n".format(wynik_1))
plik.close()

Zadanie 4.2

Silnią liczby naturalnej k większej od 0 nazywamy wartość iloczynu 1·2·…·k i oznaczamy przez k!.

Przyjmujemy, że 0! = 1. Zatem mamy:

0! = 1
1! = 1
2! = 1 x 2 = 2
3! = 1 x 2 x 3 = 6
4! = 1 x 2 x 3 x 4 = 24

Dowolną liczbę naturalną możemy rozbić na cyfry, a następnie policzyć sumę silni jej cyfr. Na przykład dla liczby 343 mamy 3! + 4! + 3! = 6 + 24 + 6 = 36.

Podaj, w kolejności ich występowania w pliku liczby.txt, wszystkie liczby, które są równe sumie silni swoich cyfr.

W pliku przyklad.txt znajduje się jedna taka liczba: 145 (1!+4!+5! =1+24+120 =145).

Rozwiązanie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def silnia(n):
    if n == 1 or n == 0:
        return 1
    else:
        return n * silnia(n-1)

plik = open('liczby.txt', 'r')
lista = plik.readlines()
plik.close()
liczby = [i.rstrip('\n') for i in lista]

poprawne = []

for i in liczby:
    suma = 0
    for x in str(i):
        suma += silnia(int(x))
    if suma == i:
        poprawne.append(i)

wynik_2 = poprawne

plik = open("wyniki4.txt", "w")
plik.writelines("4.2: {}\n".format(wynik_2))
plik.close()

Zadanie 4.3

W pliku liczby.txt znajdź najdłuższy ciąg liczb występujących kolejno po sobie i taki, że największy wspólny dzielnik ich wszystkich jest większy od 1 (innymi słowy: istnieje taka liczba całkowita większa od 1, która jest dzielnikiem każdej z tych liczb). Jako odpowiedź podaj wartość pierwszej liczby w takim ciągu, długość ciągu oraz największą liczbę całkowitą, która jest dzielnikiem każdej liczby w tym ciągu. W pliku z danymi jest tylko jeden taki ciąg o największej długości.

Uwaga: Możesz skorzystać z zależności NWD(a, b, c) = NWD(NWD(a, b), c).

Przykład: Dla liczb 3, 7, 4, 6, 10, 2, 5 odpowiedzią jest 4 (pierwsza liczba ciągu), 4 (długość ciągu) i 2 (największy wspólny dzielnik), natomiast dla liczb 5, 70, 28, 42, 98, 1 odpowiedzią jest 70 (pierwsza liczba ciągu), 4 (długość ciągu) i 14 (największy wspólny dzielnik).

Odpowiedź dla pliku przyklad.txt: pierwsza liczba ciągu 90, długość 5, największy wspólny dzielnik 10.

Rozwiązanie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import math

plik = open('liczby.txt', 'r')
lista = plik.readlines()
plik.close()
liczby = [i.rstrip('\n') for i in lista]

najdluzszy_zbior = []
mozliwe_zbiory = []
licznik = liczby[0]

poprzednie = 0

for i in liczby:
    if len(mozliwe_zbiory) == 0:
        mozliwe_zbiory.append(i)
    else:
        licznik = mozliwe_zbiory[0]
        for x in mozliwe_zbiory:
            licznik = math.gcd(licznik, x)
        if math.gcd(licznik, i) != 1:
            mozliwe_zbiory.append(i)
        else:
            poprzednie = mozliwe_zbiory[-1]
            if len(mozliwe_zbiory) > len(najdluzszy_zbior):
                najdluzszy_zbior = mozliwe_zbiory.copy()
                mozliwe_zbiory = [i]
            else:
                mozliwe_zbiory = [i]
            if math.gcd(i, poprzednie) > 1:
                mozliwe_zbiory = [poprzednie, i]

print(najdluzszy_zbior)
NWD = najdluzszy_zbior[0]
for x in najdluzszy_zbior:
    NWD = math.gcd(NWD, x)


wynik_3 = "Pierwsza liczba: {}, Dlugosc: {}, NWD: {}".format(najdluzszy_zbior[0], len(najdluzszy_zbior), NWD)
print(wynik_3)

plik = open("wyniki4.txt", "w")
plik.writelines("4.3: {}\n".format(wynik_3))
plik.close()