From 34294b564144d94530ff1be8b0f6e61465db3480 Mon Sep 17 00:00:00 2001 From: Du Yuanchao Date: Mon, 17 Aug 2020 02:31:06 +0800 Subject: [PATCH] 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 --- DIRECTORY.md | 5 ++ maths/sum_of_digits.py | 133 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 137 insertions(+), 1 deletion(-) diff --git a/DIRECTORY.md b/DIRECTORY.md index f97a8e55f..1530ed763 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -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) @@ -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 diff --git a/maths/sum_of_digits.py b/maths/sum_of_digits.py index 88baf2ca2..64da00d46 100644 --- a/maths/sum_of_digits.py +++ b/maths/sum_of_digits.py @@ -1,3 +1,6 @@ +from timeit import timeit + + def sum_of_digits(n: int) -> int: """ Find the sum of digits of a number. @@ -6,7 +9,12 @@ 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 @@ -14,5 +22,128 @@ def sum_of_digits(n: int) -> int: 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()