---
title: WDI 4.4
---
```python=
"""
Specyfikacja
Wejście: n, k - dodatnie liczby całkowite, a1...ak - ciąd liczb naturalnych >1
Wyjście: p – największa liczba naturalna taka, że n jest podzielne przez a^p dla jakiegoś i{1, 2,…, k} oraz liczby ze zbioru { a1, …, ak } których p-ta potęga jest dzielnikiem n.
Idea rozwiązania:
1. Rozkładamy liczbę n na czynniki pierwsze:
1.1 Sprawdzamy podzielność n przez każdą liczbę z zakresu [2, sqrt n]
1.2 Jeśli n dzieli się przez wybraną liczbe, to wnosimy ją do słownika jako klucz i przypisujemy jej znaczenie +=1
1.3. Jeśli n nie dzieli się przez liczbę, to przechodzimy do kolejnej
1.4 Jeśli po zakończeniu pętli została nam liczba > 1, to ona jest liczbą pierwszą, którą też wnosimy do słownika
2. Z słownika wiebieramy p - największą potęgę
3. Sprawdzamy które czynniki piersze odpowiadają tej potędze i wnosimy je do listy
4. Wypisujęmy p oraz listę
"""
def primfacs(n):
i = 2
primfac = {}
while i * i <= n:
while n % i == 0:
if i in primfac:
primfac[i] += 1
else:
primfac[i] = 1
n = int(n / i)
i = i + 1
if n > 1:
primfac[n] = 1
p = max(primfac.values())
print ("p =", p, "oraz n dzieli się przez", znajdz_mnoznik(p, primfac),"^",p)
return primfac
def znajdz_mnoznik(p, primfac):
result_list = []
primfac_list = primfac.items()
for num, q in primfac_list:
if p == q:
result_list.append(str(num))
return "".join(result_list)
print(primfacs(16))
#v2
from wdi.lib.wdi import Array, printw
def get_index_by_name(source, name):
for i in range(len(source)):
if source[i][0] == name:
return i
return -1
def set_new_value(source, name):
for i in range(len(source)):
item = source[i]
if item[0] == 0:
item[0] = name
item[1] = 1
break
def get_max_value(source):
max_value = source[0][1]
for i in range(1, len(source)):
value = source[i][1]
if max_value < value:
max_value = value
return max_value
def primfacs(n, k):
i = 2
primfac = Array(k, 2)
while i * i <= n:
while n % i == 0:
index = get_index_by_name(primfac, i)
if index != -1:
primfac[index][1] += 1
else:
set_new_value(primfac, i)
n = n // i
i = i + 1
if n > 1:
set_new_value(primfac, n)
p = get_max_value(primfac)
print ("p =", p, "oraz n dzieli się przez", znajdz_mnoznik(p, primfac),"^",p)
return primfac
def znajdz_mnoznik(p, primfac):
result = ""
for i in range(len(primfac)):
if p == primfac[i][1]:
result += str(primfac[i][0]) + ' '
return result
result = primfacs(144 * 625, 5)
for i in range(len(result)):
print(result[i][0], result[i][1])
```