Dodawanie cyfr od lewej do prawej

Odpowiedz Nowy wątek
2019-06-19 21:17
0

Ta funkcja wypisuje cyfry od lewej do prawej, bez korzystania z żadnego stringa/tablicy.

get_digit(num):
    if num < 10:
        print(num)
    else:
        get_digit(num // 10)
        print(num % 10)

Jak ją zmodyfikować żeby (bez korzystania po prostu ze zmiennej globalnej) sumowała cyfry? Zależy mi, żeby nie korzystać ze stringów i tablic.

edytowany 2x, ostatnio: yanaz_pl, 2019-06-19 21:19

Pozostało 580 znaków

2019-06-19 21:41
1

Skorzystaj ze zmiennej nie globalnej :P

Pozostało 580 znaków

2019-06-19 21:49
def get_digit(num):
  if num < 10:
      print(num)
      return num
  else:
      print(num % 10)
      return (num % 10 + get_digit(num // 10))

Na szybko można i tak

Od lewej do prawej? Tak wiem, bez roznicy. - lion137 2019-06-19 22:10

Pozostało 580 znaków

2019-06-20 00:05
1

Lepiej to zrobić przez wbudowany divmod :).
Bo divmod za jednym razem zwraca modulo i reszte z dzielenia, działa to szybciej niż osobno modulo i całości z dzielenia :D

def foo(num):
    div, mod = divmod(num, 10)
    if div:
        return foo(div)+mod
    else:
        return mod

Nadal sumuje od lewej do prawej, ale dodawanie jest przemienne :)

Nie korzystając ze zmiennych tymczasowych, też się da:

def foo(num, mod=0):
    if num:
        return foo(*divmod(num, 10)) + mod
    else:
        return num + mod

Sam się w sumie ciekawię jak porównanie prędkości, muszę pamiętać by sobie sprawdzić pod linuxem, bo nie chce mi się szukać jak to przetestować ani sprawdzać czy jest tak samo na windowsie :P


Linux Mint
Arduino / Python 3.5.2
edytowany 1x, ostatnio: Guaz, 2019-06-20 00:09

Pozostało 580 znaków

2019-06-20 10:45
0
Guaz napisał(a):

Nie korzystając ze zmiennych tymczasowych, też się da:

def foo(num, mod=0):
  if num:
      return foo(*divmod(num, 10)) + mod
  else:
      return num + mod

Dwa razy szybsze jest rozwiązanie z użyciem map i rzutowaniem liczby na str:

n = 5643096584357
%%timeit
foo(n) # 65
# 100000 loops, best of 3: 7.16 µs per loop
%%timeit
sum(map(int, str(n)))
# 100000 loops, best of 3: 3.63 µs per loop
edytowany 1x, ostatnio: Pyxis, 2019-06-20 10:45
A to akurat oczywiste że będzie szybsze, bo divmod do sumowania cyfr najlepszy nie jest z trzeźwego punktu widzenia, nadal wykonuje skomplikowane operacje 'modulo'. Przynajmniej dopóki działamy na systemie dziesiętnym, dużo lepiej się sprawdza sumowanie po zrzutowaniu na stringa jak napisałeś :). divmod tutaj tłumaczę tym że autor prosił bez rzutowania na stringa czy listę :D - Guaz 2019-06-20 10:57
Jasne. Zrobiłem porównanie w ramach przywitania się z IPython-em po porannej kawie :) - Pyxis 2019-06-20 11:00
Wstajemy o podobnych godzinach :D - Guaz 2019-06-20 11:07

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0