# Mathematics
```
range(10) -> 0.... 9
range(1,10) -> 1...9
range(1,10,2) -> 1,3,5,7,9
```
- Count digits
``` python
# TC: O(number of digits)
# SC: O(1)
def count_digits(n):
result = 0
while n > 0:
n = n // 10
result += 1
return result
```
- Palindrome number

``` python
# TC: O(number of digits)
# SC: O(number of digits)
def is_palindrome(n):
rev = str(n)[::-1] # reverse a string
if n == int(rev):
return True
return False
```
``` python
# TC: O(number of digits)
# SC: O(1)
def is_palindrome(n):
rev = 0
temp = n
while temp > 0:
last_digit = temp % 10
rev = rev * 10 + last_digit
temp = temp // 10
return rev == n
```
- factorial
``` python
# TC: O(n)
# SC: O(1)
def factorial(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
```
- trailing zeros in factorial n

``` python
# TC: O(n)
# SC: O(1)
def factorial_traling_zeros(n):
fact = 1
for i in range(1, n + 1):
fact *= i
result = 0
while fact > 0:
last_digit = fact % 10
if last_digit != 0:
break
result += 1
fact = fact // 10
return result
```
``` python
# TC: O(log n)
# SC: O(1)
def factorial_traling_zeros(n):
result = 0
x = 5
while x <= n:
num_5 = n // x
result += num_5
x = x * 5
return result
```
- Greatest common divisor
greatest number that divides both numbers

``` python
# TC: O(min(a,b))
# SC: O(1)
def gcd(a, b):
result = 1
for x in range(2, min(a, b) + 1):
if a % x == 0 and b % x == 0:
result = x
return result
```