Python求解进制问题(阿里巴巴2015笔试题)
问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?
解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来不及。也就是说,应该是有更简单的方法。以我们最熟悉的十进制为例,一个数乘以10相当于左移1位而右边补0;
了解二进制计算的朋友们应该知道,对一个二进制数乘以2相当于左移1位而右边补0。恭喜,这对于任意素数进制都是成立的。也就是说,把从1到30的整数简单因数分解一下,看看有多少个3,那么题目中最终计算结果末尾就有多少个0。
1.(python实现)下面的代码有4个函数,其中第二个函数调用了第一个函数,使用的是传统笨办法;第四个函数调用了第三个函数,使用的上面描述中的第二个方法。
1 from functools import reduce 2 from operator import mul 3 from random import randrange, choice 4 5 def int2base(n, base): 6 '''把十进制整数n转换成base进制''' 7 result = [] 8 div = n 9 #除基取余,逆序排列 10 while div != 0: 11 div, mod = divmod(div, base) 12 result.append(mod) 13 result.reverse() 14 result = ''.join(map(str, result)) 15 #变成数字,返回 16 return eval(result) 17 18 def zeros1(n, base): 19 '''n!转换成base进制后,最后有多少个连续0''' 20 #计算n!,并转换成base进制 21 fac_n = str(int2base(reduce(mul, range(1, n+1), 1), base)) 22 #从后往前遍历,查找第一个不是0的位置 23 length = len(fac_n) 24 for i in range(length-1, -1, -1): 25 if fac_n[i] != '0': 26 return length-i-1 27 28 def bases(n, base): 29 '''计算n分解因数后有几个base相乘''' 30 num = 0 31 while n%base == 0: 32 num += 1 33 n = n // base 34 return num 35 36 def zeros2(n, base): 37 '''从1到n的整数中,所有数字因数分解后共有多少个base,n!转换成base进制后最后就有多少个连续0''' 38 return sum(bases(i, base) for i in range(1, n+1) if i%base == 0)
2.java实现第二种方法(第一种方法java实现估计代码太过累赘)
1 public class test { 2 3 public static void main(String[] args) { 4 System.out.println(zero2(30,3)); 5 } 6 7 public static int bases(int n,int base){ 8 int num = 0; 9 while(n % base == 0){ 10 num += 1; 11 n = n / base; 12 } 13 return num; 14 } 15 16 public static int zero2(int n,int base){ 17 int num = 0; 18 for(int i=1 ; i < n+1 ; i++){ 19 if(i % base == 0){ 20 num += bases(i,base); 21 } 22 } 23 return num; 24 } 25 }
参考资料:微信号 Python_xiaowu