Skip to content

Commit

Permalink
Update sum_of_digits.py (TheAlgorithms#2319)
Browse files Browse the repository at this point in the history
* * support negative number
* add different version

* fixup! Format Python code with psf/black push

* sum(int(c) for c in str(abs(n)))

* updating DIRECTORY.md

Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
Co-authored-by: Christian Clauss <[email protected]>
  • Loading branch information
3 people authored Aug 16, 2020
1 parent 7e4176c commit 34294b5
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 1 deletion.
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@
* [Power Iteration](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/power_iteration.py)
* [Rayleigh Quotient](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/rayleigh_quotient.py)
* [Test Linear Algebra](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/test_linear_algebra.py)
* [Transformations 2D](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/transformations_2d.py)

## Machine Learning
* [Astar](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/astar.py)
Expand Down Expand Up @@ -580,6 +581,10 @@
* [Sol32](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_32/sol32.py)
* Problem 33
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_33/sol1.py)
* Problem 34
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_34/sol1.py)
* Problem 35
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_35/sol1.py)
* Problem 36
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_36/sol1.py)
* Problem 40
Expand Down
133 changes: 132 additions & 1 deletion maths/sum_of_digits.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from timeit import timeit


def sum_of_digits(n: int) -> int:
"""
Find the sum of digits of a number.
Expand All @@ -6,13 +9,141 @@ def sum_of_digits(n: int) -> int:
15
>>> sum_of_digits(123)
6
>>> sum_of_digits(-123)
6
>>> sum_of_digits(0)
0
"""
n = -n if n < 0 else n
res = 0
while n > 0:
res += n % 10
n = n // 10
return res


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
"""
n = -n if n < 0 else n
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:
"""
Benchmark code for comparing 3 functions,
with 3 different length int values.
"""
print("\nFor small_num = ", small_num, ":")
print(
"> sum_of_digits()",
"\t\tans =",
sum_of_digits(small_num),
"\ttime =",
timeit("z.sum_of_digits(z.small_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_recursion()",
"\tans =",
sum_of_digits_recursion(small_num),
"\ttime =",
timeit("z.sum_of_digits_recursion(z.small_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_compact()",
"\tans =",
sum_of_digits_compact(small_num),
"\ttime =",
timeit("z.sum_of_digits_compact(z.small_num)", setup="import __main__ as z"),
"seconds",
)

print("\nFor medium_num = ", medium_num, ":")
print(
"> sum_of_digits()",
"\t\tans =",
sum_of_digits(medium_num),
"\ttime =",
timeit("z.sum_of_digits(z.medium_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_recursion()",
"\tans =",
sum_of_digits_recursion(medium_num),
"\ttime =",
timeit("z.sum_of_digits_recursion(z.medium_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_compact()",
"\tans =",
sum_of_digits_compact(medium_num),
"\ttime =",
timeit("z.sum_of_digits_compact(z.medium_num)", setup="import __main__ as z"),
"seconds",
)

print("\nFor large_num = ", large_num, ":")
print(
"> sum_of_digits()",
"\t\tans =",
sum_of_digits(large_num),
"\ttime =",
timeit("z.sum_of_digits(z.large_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_recursion()",
"\tans =",
sum_of_digits_recursion(large_num),
"\ttime =",
timeit("z.sum_of_digits_recursion(z.large_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_compact()",
"\tans =",
sum_of_digits_compact(large_num),
"\ttime =",
timeit("z.sum_of_digits_compact(z.large_num)", setup="import __main__ as z"),
"seconds",
)


if __name__ == "__main__":
print(sum_of_digits(12345)) # ===> 15
small_num = 262144
medium_num = 1125899906842624
large_num = 1267650600228229401496703205376
benchmark()
import doctest

doctest.testmod()

0 comments on commit 34294b5

Please sign in to comment.