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

Liczby zaprzyjaźnione w Pythonie

+1 głos
281 wizyt
pytanie zadane 31 stycznia w Python, Django przez Komil Nowicjusz (130 p.)
edycja 31 stycznia przez JSHolic

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 przez Secrus Nałogowiec (32,340 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 przez adrian17 Ekspert (203,080 p.)
edycja 31 stycznia 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 przez Arkadiusz Sikorski Pasjonat (19,380 p.)
edycja 31 stycznia 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 przez Arkadiusz Sikorski Pasjonat (19,380 p.)
edycja 1 lutego 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 przez Komil Nowicjusz (130 p.)

@Arkadiusz Sikorski, dzięki za pomoc.

0 głosów
odpowiedź 1 lutego przez mokrowski VIP (112,640 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 przez Komil Nowicjusz (130 p.)
Bardzo dziekuję za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 55 wizyt
–1 głos
1 odpowiedź 68 wizyt
pytanie zadane 5 stycznia w HTML i CSS przez pomaraqcz Początkujący (380 p.)
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

66,991 zapytań

113,896 odpowiedzi

241,351 komentarzy

46,948 pasjonatów

Przeglądających: 228
Pasjonatów: 15 Gości: 213

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...