1
+ from timeit import timeit
2
+
3
+
1
4
def sum_of_digits (n : int ) -> int :
2
5
"""
3
6
Find the sum of digits of a number.
@@ -6,13 +9,141 @@ def sum_of_digits(n: int) -> int:
6
9
15
7
10
>>> sum_of_digits(123)
8
11
6
12
+ >>> sum_of_digits(-123)
13
+ 6
14
+ >>> sum_of_digits(0)
15
+ 0
9
16
"""
17
+ n = - n if n < 0 else n
10
18
res = 0
11
19
while n > 0 :
12
20
res += n % 10
13
21
n = n // 10
14
22
return res
15
23
16
24
25
+ def sum_of_digits_recursion (n : int ) -> int :
26
+ """
27
+ Find the sum of digits of a number using recursion
28
+
29
+ >>> sum_of_digits_recursion(12345)
30
+ 15
31
+ >>> sum_of_digits_recursion(123)
32
+ 6
33
+ >>> sum_of_digits_recursion(-123)
34
+ 6
35
+ >>> sum_of_digits_recursion(0)
36
+ 0
37
+ """
38
+ n = - n if n < 0 else n
39
+ return n if n < 10 else n % 10 + sum_of_digits (n // 10 )
40
+
41
+
42
+ def sum_of_digits_compact (n : int ) -> int :
43
+ """
44
+ Find the sum of digits of a number
45
+
46
+ >>> sum_of_digits_compact(12345)
47
+ 15
48
+ >>> sum_of_digits_compact(123)
49
+ 6
50
+ >>> sum_of_digits_compact(-123)
51
+ 6
52
+ >>> sum_of_digits_compact(0)
53
+ 0
54
+ """
55
+ return sum (int (c ) for c in str (abs (n )))
56
+
57
+
58
+ def benchmark () -> None :
59
+ """
60
+ Benchmark code for comparing 3 functions,
61
+ with 3 different length int values.
62
+ """
63
+ print ("\n For small_num = " , small_num , ":" )
64
+ print (
65
+ "> sum_of_digits()" ,
66
+ "\t \t ans =" ,
67
+ sum_of_digits (small_num ),
68
+ "\t time =" ,
69
+ timeit ("z.sum_of_digits(z.small_num)" , setup = "import __main__ as z" ),
70
+ "seconds" ,
71
+ )
72
+ print (
73
+ "> sum_of_digits_recursion()" ,
74
+ "\t ans =" ,
75
+ sum_of_digits_recursion (small_num ),
76
+ "\t time =" ,
77
+ timeit ("z.sum_of_digits_recursion(z.small_num)" , setup = "import __main__ as z" ),
78
+ "seconds" ,
79
+ )
80
+ print (
81
+ "> sum_of_digits_compact()" ,
82
+ "\t ans =" ,
83
+ sum_of_digits_compact (small_num ),
84
+ "\t time =" ,
85
+ timeit ("z.sum_of_digits_compact(z.small_num)" , setup = "import __main__ as z" ),
86
+ "seconds" ,
87
+ )
88
+
89
+ print ("\n For medium_num = " , medium_num , ":" )
90
+ print (
91
+ "> sum_of_digits()" ,
92
+ "\t \t ans =" ,
93
+ sum_of_digits (medium_num ),
94
+ "\t time =" ,
95
+ timeit ("z.sum_of_digits(z.medium_num)" , setup = "import __main__ as z" ),
96
+ "seconds" ,
97
+ )
98
+ print (
99
+ "> sum_of_digits_recursion()" ,
100
+ "\t ans =" ,
101
+ sum_of_digits_recursion (medium_num ),
102
+ "\t time =" ,
103
+ timeit ("z.sum_of_digits_recursion(z.medium_num)" , setup = "import __main__ as z" ),
104
+ "seconds" ,
105
+ )
106
+ print (
107
+ "> sum_of_digits_compact()" ,
108
+ "\t ans =" ,
109
+ sum_of_digits_compact (medium_num ),
110
+ "\t time =" ,
111
+ timeit ("z.sum_of_digits_compact(z.medium_num)" , setup = "import __main__ as z" ),
112
+ "seconds" ,
113
+ )
114
+
115
+ print ("\n For large_num = " , large_num , ":" )
116
+ print (
117
+ "> sum_of_digits()" ,
118
+ "\t \t ans =" ,
119
+ sum_of_digits (large_num ),
120
+ "\t time =" ,
121
+ timeit ("z.sum_of_digits(z.large_num)" , setup = "import __main__ as z" ),
122
+ "seconds" ,
123
+ )
124
+ print (
125
+ "> sum_of_digits_recursion()" ,
126
+ "\t ans =" ,
127
+ sum_of_digits_recursion (large_num ),
128
+ "\t time =" ,
129
+ timeit ("z.sum_of_digits_recursion(z.large_num)" , setup = "import __main__ as z" ),
130
+ "seconds" ,
131
+ )
132
+ print (
133
+ "> sum_of_digits_compact()" ,
134
+ "\t ans =" ,
135
+ sum_of_digits_compact (large_num ),
136
+ "\t time =" ,
137
+ timeit ("z.sum_of_digits_compact(z.large_num)" , setup = "import __main__ as z" ),
138
+ "seconds" ,
139
+ )
140
+
141
+
17
142
if __name__ == "__main__" :
18
- print (sum_of_digits (12345 )) # ===> 15
143
+ small_num = 262144
144
+ medium_num = 1125899906842624
145
+ large_num = 1267650600228229401496703205376
146
+ benchmark ()
147
+ import doctest
148
+
149
+ doctest .testmod ()
0 commit comments