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]
浙公网安备 33010602011771号