mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-01-18 16:27:02 +00:00
Update sum_of_digits.py (#2319)
* * 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 <cclauss@me.com>
This commit is contained in:
parent
7e4176ccaf
commit
34294b5641
|
@ -297,6 +297,7 @@
|
||||||
* [Power Iteration](https://github.com/TheAlgorithms/Python/blob/master/linear_algebra/src/power_iteration.py)
|
* [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)
|
* [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)
|
* [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
|
## Machine Learning
|
||||||
* [Astar](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/astar.py)
|
* [Astar](https://github.com/TheAlgorithms/Python/blob/master/machine_learning/astar.py)
|
||||||
|
@ -580,6 +581,10 @@
|
||||||
* [Sol32](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_32/sol32.py)
|
* [Sol32](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_32/sol32.py)
|
||||||
* Problem 33
|
* Problem 33
|
||||||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_33/sol1.py)
|
* [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
|
* Problem 36
|
||||||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_36/sol1.py)
|
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_36/sol1.py)
|
||||||
* Problem 40
|
* Problem 40
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
from timeit import timeit
|
||||||
|
|
||||||
|
|
||||||
def sum_of_digits(n: int) -> int:
|
def sum_of_digits(n: int) -> int:
|
||||||
"""
|
"""
|
||||||
Find the sum of digits of a number.
|
Find the sum of digits of a number.
|
||||||
|
@ -6,7 +9,12 @@ def sum_of_digits(n: int) -> int:
|
||||||
15
|
15
|
||||||
>>> sum_of_digits(123)
|
>>> sum_of_digits(123)
|
||||||
6
|
6
|
||||||
|
>>> sum_of_digits(-123)
|
||||||
|
6
|
||||||
|
>>> sum_of_digits(0)
|
||||||
|
0
|
||||||
"""
|
"""
|
||||||
|
n = -n if n < 0 else n
|
||||||
res = 0
|
res = 0
|
||||||
while n > 0:
|
while n > 0:
|
||||||
res += n % 10
|
res += n % 10
|
||||||
|
@ -14,5 +22,128 @@ def sum_of_digits(n: int) -> int:
|
||||||
return res
|
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__":
|
if __name__ == "__main__":
|
||||||
print(sum_of_digits(12345)) # ===> 15
|
small_num = 262144
|
||||||
|
medium_num = 1125899906842624
|
||||||
|
large_num = 1267650600228229401496703205376
|
||||||
|
benchmark()
|
||||||
|
import doctest
|
||||||
|
|
||||||
|
doctest.testmod()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user