diff --git a/maths/sum_of_digits.py b/maths/sum_of_digits.py index 64da00d4634c..d54cd22234b6 100644 --- a/maths/sum_of_digits.py +++ b/maths/sum_of_digits.py @@ -55,9 +55,32 @@ def sum_of_digits_compact(n: int) -> int: return sum(int(c) for c in str(abs(n))) +def digital_root(n: int) -> int: + """ + finding the digital root of n + https://en.wikipedia.org/wiki/Digital_root + + >>> digital_root(394328) + 2 + >>> digital_root(-394328) + -1 + >>> digital_root(123) + 6 + >>> digital_root(0) + 0 + >>> digital_root("109820394") + -1 + """ + + try: + return n % 9 or n and 9 if n >= 0 else -1 + except TypeError: + return -1 + + def benchmark() -> None: """ - Benchmark code for comparing 3 functions, + Benchmark code for comparing 4 functions, with 3 different length int values. """ print("\nFor small_num = ", small_num, ":") @@ -85,6 +108,8 @@ def benchmark() -> None: timeit("z.sum_of_digits_compact(z.small_num)", setup="import __main__ as z"), "seconds", ) + result = timeit("z.digital_root(z.small_num)", setup="import __main__ as z") + print(f"> digital_root()\tans = {digital_root(small_num)}\ttime = {result} seconds") print("\nFor medium_num = ", medium_num, ":") print( @@ -111,6 +136,14 @@ def benchmark() -> None: timeit("z.sum_of_digits_compact(z.medium_num)", setup="import __main__ as z"), "seconds", ) + print( + "> digital_root()", + "\t\tans =", + digital_root(medium_num), + "\ttime =", + timeit("z.digital_root(z.medium_num)", setup="import __main__ as z"), + "seconds", + ) print("\nFor large_num = ", large_num, ":") print( @@ -137,6 +170,14 @@ def benchmark() -> None: timeit("z.sum_of_digits_compact(z.large_num)", setup="import __main__ as z"), "seconds", ) + print( + "> digital_root()", + "\tans =", + digital_root(large_num), + "\ttime =", + timeit("z.digital_root(z.large_num)", setup="import __main__ as z"), + "seconds", + ) if __name__ == "__main__":