2020-06-02 21:38:32 +00:00
|
|
|
def sum_of_digits(n: int) -> int:
|
|
|
|
"""
|
|
|
|
Find the sum of digits of a number.
|
|
|
|
>>> sum_of_digits(12345)
|
|
|
|
15
|
|
|
|
>>> sum_of_digits(123)
|
|
|
|
6
|
2020-08-16 18:31:06 +00:00
|
|
|
>>> sum_of_digits(-123)
|
|
|
|
6
|
|
|
|
>>> sum_of_digits(0)
|
|
|
|
0
|
2020-06-02 21:38:32 +00:00
|
|
|
"""
|
2022-10-30 10:56:54 +00:00
|
|
|
n = abs(n)
|
2020-06-02 21:38:32 +00:00
|
|
|
res = 0
|
|
|
|
while n > 0:
|
|
|
|
res += n % 10
|
2022-10-30 10:56:54 +00:00
|
|
|
n //= 10
|
2020-06-02 21:38:32 +00:00
|
|
|
return res
|
|
|
|
|
|
|
|
|
2020-08-16 18:31:06 +00:00
|
|
|
def sum_of_digits_recursion(n: int) -> int:
|
|
|
|
"""
|
|
|
|
Find the sum of digits of a number using recursion
|
|
|
|
>>> sum_of_digits_recursion(12345)
|
|
|
|
15
|
|
|
|
>>> sum_of_digits_recursion(123)
|
|
|
|
6
|
|
|
|
>>> sum_of_digits_recursion(-123)
|
|
|
|
6
|
|
|
|
>>> sum_of_digits_recursion(0)
|
|
|
|
0
|
|
|
|
"""
|
2022-10-30 10:56:54 +00:00
|
|
|
n = abs(n)
|
2020-08-16 18:31:06 +00:00
|
|
|
return n if n < 10 else n % 10 + sum_of_digits(n // 10)
|
|
|
|
|
|
|
|
|
|
|
|
def sum_of_digits_compact(n: int) -> int:
|
|
|
|
"""
|
|
|
|
Find the sum of digits of a number
|
|
|
|
>>> sum_of_digits_compact(12345)
|
|
|
|
15
|
|
|
|
>>> sum_of_digits_compact(123)
|
|
|
|
6
|
|
|
|
>>> sum_of_digits_compact(-123)
|
|
|
|
6
|
|
|
|
>>> sum_of_digits_compact(0)
|
|
|
|
0
|
|
|
|
"""
|
|
|
|
return sum(int(c) for c in str(abs(n)))
|
|
|
|
|
|
|
|
|
|
|
|
def benchmark() -> None:
|
|
|
|
"""
|
2022-11-01 13:07:11 +00:00
|
|
|
Benchmark multiple functions, with three different length int values.
|
2020-08-16 18:31:06 +00:00
|
|
|
"""
|
2022-11-01 13:07:11 +00:00
|
|
|
from collections.abc import Callable
|
|
|
|
from timeit import timeit
|
2020-08-16 18:31:06 +00:00
|
|
|
|
2022-11-01 13:07:11 +00:00
|
|
|
def benchmark_a_function(func: Callable, value: int) -> None:
|
|
|
|
call = f"{func.__name__}({value})"
|
|
|
|
timing = timeit(f"__main__.{call}", setup="import __main__")
|
|
|
|
print(f"{call:56} = {func(value)} -- {timing:.4f} seconds")
|
2020-08-16 18:31:06 +00:00
|
|
|
|
2022-11-01 13:07:11 +00:00
|
|
|
for value in (262144, 1125899906842624, 1267650600228229401496703205376):
|
|
|
|
for func in (sum_of_digits, sum_of_digits_recursion, sum_of_digits_compact):
|
|
|
|
benchmark_a_function(func, value)
|
|
|
|
print()
|
2020-08-16 18:31:06 +00:00
|
|
|
|
|
|
|
|
2020-06-02 21:38:32 +00:00
|
|
|
if __name__ == "__main__":
|
2020-08-16 18:31:06 +00:00
|
|
|
import doctest
|
|
|
|
|
|
|
|
doctest.testmod()
|
2022-11-01 13:07:11 +00:00
|
|
|
benchmark()
|