Factorial tail:求一个数的阶乘转化成n进制之后末尾有几个零

比如:

给定10的阶乘,16进制

10的阶乘是3628800,转化成16进制后是375F00

所以返回值应该是2

思路:

直接算阶乘肯定不行,那是送人头,这个题肯定会有大一点的数测试.

我就想能不能直接每个数都分解成进制数的因数

比如10进制的因数是5和2,且一个5和一个2相乘就是10

那么数出来最后的阶乘里有几个5和几个2,然后看看能组合成几个10,就可以算出来后面有几个0了.

代码:

 

import math
def zeroes (base, number):
  zero_count = 0
    base_dividable_count = 0
    factors_arr = get_num_factors(base)
  #获取base的质因数,比如,100则是2和5
    factors = factors_arr[0]
  #这是组成一个base需要的因数,比如,100需要两个2和两个5,也就是2*2*5*5
    factors_to_contribute_base = factors_arr[1]
  #这个字典储存给的number的阶乘里有多少个质因数
    factors_count = {}
  #初始化所有质因数的数量
    for factor in factors:
        factors_count[str(factor)] = 0
    for i in range(1,number+1):
        number_mutable = int(i)
        for factor in factors:
       #直接把所有的质因数数量算出来
            while number_mutable % factor ==0:
                factors_count[str(factor)] = int(factors_count[str(factor)]) +1
                number_mutable = number_mutable / factor
    all_counts = []
    for factor in factors:
        all_counts.append(factors_count[str(factor)]/factors_to_contribute_base.count(factor))
    if  all_counts != []:
        zero_count = math.floor(min(all_counts))
    
    return zero_count
  
  
  
def get_num_factors(num):
    list0=[]
    tmp=2while (num>=tmp):
        k=num%tmp
        if( k == 0):
            list0.append(tmp)
            num=num/tmp 
        else:
            tmp=tmp+1 
return [list(set(list0)),list0]

 

posted on 2019-05-20 23:07  必须喝三瓶大力  阅读(239)  评论(0)    收藏  举报

导航