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() |