Skip to content

Commit 05cfc25

Browse files
vasugamdhastokhos
authored andcommitted
Updated maths/number_of_digits.py (TheAlgorithms#2221)
* Updated number_of_digits.py Added two more methods! * Update number_of_digits.py * Update number_of_digits.py * Added benchmarks! * Update number_of_digits.py * Update number_of_digits.py * Update number_of_digits.py * Update number_of_digits.py * Update number_of_digits.py * Update number_of_digits.py * Update number_of_digits.py
1 parent 478ad07 commit 05cfc25

File tree

1 file changed

+82
-1
lines changed

1 file changed

+82
-1
lines changed

Diff for: maths/number_of_digits.py

+82-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import math
2+
from timeit import timeit
3+
4+
15
def num_digits(n: int) -> int:
26
"""
37
Find the number of digits in a number.
@@ -14,5 +18,82 @@ def num_digits(n: int) -> int:
1418
return digits
1519

1620

21+
def num_digits_fast(n: int) -> int:
22+
"""
23+
Find the number of digits in a number.
24+
abs() is used as logarithm for negative numbers is not defined.
25+
26+
>>> num_digits_fast(12345)
27+
5
28+
>>> num_digits_fast(123)
29+
3
30+
"""
31+
return (math.floor(math.log(abs(n), 10) + 1))
32+
33+
34+
def num_digits_faster(n: int) -> int:
35+
"""
36+
Find the number of digits in a number.
37+
abs() is used for negative numbers
38+
39+
>>> num_digits_faster(12345)
40+
5
41+
>>> num_digits_faster(123)
42+
3
43+
"""
44+
return (len(str(abs(n))))
45+
46+
47+
def benchmark() -> None:
48+
"""
49+
Benchmark code for comparing 3 functions,
50+
with 3 different length int values.
51+
"""
52+
print('\nFor small_num = ', small_num, ':')
53+
print("> num_digits()",
54+
'\t\tans =', num_digits(small_num),
55+
'\ttime =', timeit("z.num_digits(z.small_num)",
56+
setup="import __main__ as z"), "seconds")
57+
print("> num_digits_fast()",
58+
'\tans =', num_digits_fast(small_num),
59+
'\ttime =', timeit("z.num_digits_fast(z.small_num)",
60+
setup="import __main__ as z"), "seconds")
61+
print("> num_digits_faster()",
62+
'\tans =', num_digits_faster(small_num),
63+
'\ttime =', timeit("z.num_digits_faster(z.small_num)",
64+
setup="import __main__ as z"), "seconds")
65+
66+
print('\nFor medium_num = ', medium_num, ':')
67+
print("> num_digits()",
68+
'\t\tans =', num_digits(medium_num),
69+
'\ttime =', timeit("z.num_digits(z.medium_num)",
70+
setup="import __main__ as z"), "seconds")
71+
print("> num_digits_fast()",
72+
'\tans =', num_digits_fast(medium_num),
73+
'\ttime =', timeit("z.num_digits_fast(z.medium_num)",
74+
setup="import __main__ as z"), "seconds")
75+
print("> num_digits_faster()",
76+
'\tans =', num_digits_faster(medium_num),
77+
'\ttime =', timeit("z.num_digits_faster(z.medium_num)",
78+
setup="import __main__ as z"), "seconds")
79+
80+
print('\nFor large_num = ', large_num, ':')
81+
print("> num_digits()",
82+
'\t\tans =', num_digits(large_num),
83+
'\ttime =', timeit("z.num_digits(z.large_num)",
84+
setup="import __main__ as z"), "seconds")
85+
print("> num_digits_fast()",
86+
'\tans =', num_digits_fast(large_num),
87+
'\ttime =', timeit("z.num_digits_fast(z.large_num)",
88+
setup="import __main__ as z"), "seconds")
89+
print("> num_digits_faster()",
90+
'\tans =', num_digits_faster(large_num),
91+
'\ttime =', timeit("z.num_digits_faster(z.large_num)",
92+
setup="import __main__ as z"), "seconds")
93+
94+
1795
if __name__ == "__main__":
18-
print(num_digits(12345)) # ===> 5
96+
small_num = 262144
97+
medium_num = 1125899906842624
98+
large_num = 1267650600228229401496703205376
99+
benchmark()

0 commit comments

Comments
 (0)