• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Liczby zaprzyjaźnione w Pythonie

VPS Starter Arubacloud
+1 głos
3,328 wizyt
pytanie zadane 31 stycznia 2019 w Python przez Komil Nowicjusz (130 p.)
edycja 31 stycznia 2019 przez ScriptyChris

Witam.

Zaczynam programować w  Pythonie i  moja znajomość tego języka jest strasznie podstawowa( znam pętle "for i in range" i to co widać w algorytmie). Mam problem do rozwiązania w którym należy napisać algorytm, który powie czy dane dwie liczby są zaprzyjaźnione. Mam pytanie czy idę w dobrym kierunku przy rozwiązywaniu tego zagadnienia a oto moje działania 

def zaprzy(a, b):
 dz=1
 dz2=1
 for i in range(1, a + 1 and 1, b  + 1):
   if(a % dz==0 and b % dz2==0 and sum(all(dz))=b and sum(all(dz2))=a):
    
     print("true")
   dz=dz+1
   dz +=1
   dz2=dz2+1
   dz2 +=1
  else:
    print("false")

Od razu powiem że algorytm nie działa. Z góry dziękuję za odpowiedź.

1
komentarz 31 stycznia 2019 przez Secrus Nałogowiec (32,880 p.)
Rzuć jeszcze definicją tego czym są liczby zaprzyjaźnione, jeśli zadajesz związane z nimi pytanie, ludzie są leniwi z natury i jak nie napiszesz im tego to nie będzie im się chciało pomagać
1
komentarz 31 stycznia 2019 przez adrian17 Ekspert (344,100 p.)
edycja 31 stycznia 2019 przez adrian17

Powiedz też proszę po polsku, co to według Ciebie ma robić:

range(1, a + 1 and 1, b  + 1)

Oraz

sum(all(dz))=b

 

2 odpowiedzi

+1 głos
odpowiedź 31 stycznia 2019 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
edycja 31 stycznia 2019 przez Arkadiusz Sikorski

Liczby zaprzyjaźnione – para różnych liczb naturalnych, takich że suma dzielników właściwych (mniejszych od tej liczby) każdej z tych liczb równa się drugiej.

Żeby stwierdzić, czy dwie liczby są zaprzyjaźnione, musimy:

  1. Znaleźć sumę dzielników właściwych liczby a.
  2. Znaleźć sumę dzielników właściwych liczby b.
  3. Sprawdzić, czy suma z 1. jest równa liczbie b i czy suma z 2. jest równa liczbie a.

Wyznaczanie sumy dzielników liczby a (najprościej):

Przejdź po wszystkich liczbach z przedziału <1; a), jeśli dana liczba jest dzielnikiem a, to zwiększ sumę dzielników liczby a o daną liczbę. 

Wyznaczanie sumy dzielników liczby b - analogicznie.

 

Moja rada: dwie zmienne, które są sumami odpowiednio dzielników a i b, dwie pętle, które wyznaczają te sumy.

Na koniec - jeśli a == suma_dzielników_b i b == suma_dzielników_a, to liczby są zaprzyjaźnione.

 Ponieważ zaczynasz z pythonem, poniżej masz rozwiązanie dla powyższego rozumowania:

def zaprzy(a, b):
  suma_dz_a = 0  # suma dzielników właściwych liczby a
  suma_dz_b = 0  # suma dzielników właściwych liczby b
  
  for i in range(1, a):  # pętla wyznaczająca sumę dzielników liczby a
    if a % i == 0:
      suma_dz_a += i

  for i in range(1, b):  # pętla wyznaczająca sumę dzielników liczby b
    if b % i == 0:
      suma_dz_b += i

  return a == suma_dz_b and b == suma_dz_a  # stwierdzenie czy a i b są zaprzyjaźnione
print(zaprzy(220, 284))  # zwróci True
print(zaprzy(221, 284))  # zwróci False

 

komentarz 31 stycznia 2019 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
edycja 1 lutego 2019 przez Arkadiusz Sikorski

Ponadto, możemy to ciut usprawnić:

def zaprzy(a, b):
  suma_dz_a = 0
  suma_dz_b = 0
  
  for i in range(1, a // 2 + 1):
    if a % i == 0:
      suma_dz_a += i
    if suma_dz_a > b:
      return False

  for i in range(1, b // 2 + 1):
    if b % i == 0:
      suma_dz_b += i
    if suma_dz_b > a:
      return False

  return a == suma_dz_b and b == suma_dz_a

Jeśli odpowiednia suma dzielników przekroczyła wartość drugiej liczby - to dalej nie mamy co sprawdzać - już wiemy, że liczby nie są zaprzyjaźnione.

komentarz 2 lutego 2019 przez Komil Nowicjusz (130 p.)

@Arkadiusz Sikorski, dzięki za pomoc.

0 głosów
odpowiedź 1 lutego 2019 przez mokrowski Mędrzec (155,460 p.)

Ok... definicja już padła, ale systematycznie i po kolei... 

Liczby zaprzyjaźnione – para różnych liczb naturalnych, takich że suma dzielników właściwych (mniejszych od tej liczby) każdej z tych liczb równa się drugiej.

Jeśli mają być różne i zakładając że zapisane są w zmiennych value1 i value2, to oznacza że:

return value1 != value2

Albo nieco prościej:

if value1 == value2:
    return False

Dalej dzielniki właściwe... Czyli liczby przez które dana wartość dzieli się bez reszty.

Żeby uświadomić zasadę, weź np. liczbę 14. Zastanów się, czy powyżej połowy (czyli 7) są jakiekolwiek dzielniki właściwe?

Stąd dzielników należy szukać w zakresie od 1 (jeden), do value / 2. Jeśli jednak w języku Python zastosujesz range(...), ma ono tę właściwość że potrzebuje liczb całkowitych i zwraca zakres "bez ostatniej liczby". Tak więc zakres będzie wynikiem dzielenia całkowito-liczbowego przez dwa i dodanie 1:

range(1, value // 2 + 1)

Teraz sumy...

Wykonasz je funkcją sum(...) na ciągu danych. Wystarczy więc porównanie czy sumy są równe drugiej liczbie.

Jeśli założysz że funkcje zwracające listę dzielników nazwiesz proper_divisors(...) (czyli dzielniki właściwe), funkcja zwracająca wartość True/False będzie nazywała się is_amicable_numbers(...), to funkcja będzie wyglądała tak:

def is_amicable_numbers(value1, value2):
    if value1 == value2:
        return False
    return (sum(proper_divisors(value1)) == value2) and (sum(proper_divisors(value2)) == value1)

 Dalsze usprawnienia (łączenie warunków, list comprehensions itp., podejście funkcyjne...), to już raczej po zaimplementowaniu tego podstawowego algorytmu.

BTW. Oczywiście da się to zapisać także i w 1 linii ale kod ma być czytelny... 

komentarz 2 lutego 2019 przez Komil Nowicjusz (130 p.)
Bardzo dziekuję za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 269 wizyt
pytanie zadane 26 kwietnia 2017 w JavaScript przez kralcz88 Obywatel (1,810 p.)
0 głosów
0 odpowiedzi 330 wizyt
pytanie zadane 20 listopada 2022 w Inne języki przez Elektronik Nowicjusz (160 p.)
0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 7 października 2021 w Sprzęt komputerowy przez Tyrkosz Nowicjusz (120 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...