Dodawanie cyfr od lewej do prawej

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.

1

Skorzystaj ze zmiennej nie globalnej :P

1
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

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

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

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