In [ ]:
import math

In [ ]:
def bruteforce(N):
    s = str(math.factorial(N))
    n = 0 
    for c in reversed(list(s)):
        if c == '0':
            n += 1
        else:
            break
    return n

def zeros(n):

    div = 5
    n_zeros = 0
    while div <= n:
        n_zeros += int((n-n%div)/div)
        div *= 5
    return n_zeros

        
n = 25
print(bruteforce(n))
print(zeros(n))
print(math.factorial(n))

In [ ]:
from timeit import timeit

In [ ]:
def zeros1(n):

    div = 5
    n_zeros = 0
    while div <= n:
        n_zeros += int((n-n%div)/div)
        div *= 5
    return n_zeros

def zeros2(n):

    div = 5
    n_zeros = 0
    while div <= n:
        n_zeros += (n-n%div)/div
        div *= 5
    return int(n_zeros)

In [ ]:
n = 50000
%timeit zeros1(50000)
%timeit zeros2(50000)

In [27]:
class PaginationHelper:

    # The constructor takes in an array of items and a integer indicating
    # how many items fit within a single page
    def __init__(self, collection, items_per_page):
        self.collection = collection
        self.items_per_page = items_per_page
  
    # returns the number of items within the entire collection
    def item_count(self):
        return len(self.collection)
  
    # returns the number of pages
    def page_count(self):
        ic = PaginationHelper.item_count(self)
        if ic % self.items_per_page == 0:
            return ic // self.items_per_page 
        else:
            return (ic - ic % self.items_per_page) // self.items_per_page + 1

    # returns the number of items on the current page. page_index is zero based
    # this method should return -1 for page_index values that are out of range
    def page_item_count(self, page_index):
        ic = PaginationHelper.item_count(self)
        pc = PaginationHelper.page_count(self)
        if page_index < pc - 1:
            return self.items_per_page
        elif page_index == pc - 1:
            return ic - self.items_per_page * (pc - 1)
        else: # page_index >= pc
            return - 1            
  
    # determines what page an item is on. Zero based indexes.
    # this method should return -1 for item_index values that are out of range
    def page_index(self, item_index):
        if item_index < PaginationHelper.item_count(self) or item_index < 0:
            return ( item_index - item_index % self.items_per_page ) // self.items_per_page 
        else:
            return - 1

In [14]:
def printandtype(obj):
    print(type(obj))
    print(obj)

In [24]:
p1 = PaginationHelper(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'], 3)
printandtype(p1.page_index(7))


<class 'int'>
3