问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?
解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来不及。也就是说,应该是有更简单的方法。以我们最熟悉的十进制为例,一个数乘以10相当于左移1位而右边补0;
了解二进制计算的朋友们应该知道,对一个二进制数乘以2相当于左移1位而右边补0。恭喜,这对于任意素数进制都是成立的。也就是说,把从1到30的整数简单因数分解一下,看看有多少个3,那么题目中最终计算结果末尾就有多少个0。
1.(python实现)下面的代码有4个函数,其中第二个函数调用了第一个函数,使用的是传统笨办法;第四个函数调用了第三个函数,使用的上面描述中的第二个方法。

 from functools import reduce
from operator import mul
from random import randrange, choice def int2base(n, base):
'''把十进制整数n转换成base进制'''
result = []
div = n
#除基取余,逆序排列
while div != 0:
div, mod = divmod(div, base)
result.append(mod)
result.reverse()
result = ''.join(map(str, result))
#变成数字,返回
return eval(result) def zeros1(n, base):
'''n!转换成base进制后,最后有多少个连续0'''
#计算n!,并转换成base进制
fac_n = str(int2base(reduce(mul, range(1, n+1), 1), base))
#从后往前遍历,查找第一个不是0的位置
length = len(fac_n)
for i in range(length-1, -1, -1):
if fac_n[i] != '':
return length-i-1 def bases(n, base):
'''计算n分解因数后有几个base相乘'''
num = 0
while n%base == 0:
num += 1
n = n // base
return num def zeros2(n, base):
'''从1到n的整数中,所有数字因数分解后共有多少个base,n!转换成base进制后最后就有多少个连续0'''
return sum(bases(i, base) for i in range(1, n+1) if i%base == 0)

2.java实现第二种方法(第一种方法java实现估计代码太过累赘)

 public class test {

     public static void main(String[] args) {
System.out.println(zero2(30,3));
} public static int bases(int n,int base){
int num = 0;
while(n % base == 0){
num += 1;
n = n / base;
}
return num;
} public static int zero2(int n,int base){
int num = 0;
for(int i=1 ; i < n+1 ; i++){
if(i % base == 0){
num += bases(i,base);
}
}
return num;
}
}

参考资料:微信号 Python_xiaowu

Python求解进制问题(阿里巴巴2015笔试题)的更多相关文章

  1. python 实现进制转换(二进制转十进制)

    摘自https://baike.baidu.com/item/%E5%8D%81%E8%BF%9B%E5%88%B6%E8%BD%AC%E4%BA%8C%E8%BF%9B%E5%88%B6 pytho ...

  2. python任意进制转换

    python任意进制转换 import string def module_n_converter(q, s, base=None): """ 将自然数按照给定的字符串转 ...

  3. python实现进制转换(二、八、十六进制;十进制)

    python实现进制转换(二.八.十六进制:十进制) (一)十进制整数转为二.八.十六进制 1.format实现转换>>> format(2,"b") # (10 ...

  4. Python中进制转换函数的使用

    Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...

  5. Python 各进制间的转换(转)

    转载自:http://blog.chinaunix.net/uid-21516619-id-1824975.html python 2.6以后内置函数#10进制转为2进制>>> bi ...

  6. Python 各种进制转换

    #coding=gbk var=input("请输入十六进制数:") b=bin(int(var,16)) print(b[2:]) 详细请参考python自带int函数.bin函 ...

  7. python实现进制之间的转换

    十进制转36进制: #36位映射模板 loop = '0123456789abcdefghijklmnopqrstuvwxyz' # 测试用例输入 n = a = [] : a.append( loo ...

  8. Python 16进制与字符串的转换

    电脑上装了Python2.7和3.3两个版本,平时运行程序包括在Eclipse里面调试都会使用2.7,但是由于某些原因在cmd命令行中输入python得到的解释器则是3.3, 一直没对此做处理,因为这 ...

  9. python之进制转换

    Python中二进制是以0b开头的:    例如: 0b11 则表示十进制的3 8进制是以0开头的:    例如: 011则表示十进制的9 16进制是以0x开头的:    例如: 0x11则表示十进制 ...

随机推荐

  1. X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件

    X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件 <<<<<<<<<<<<<< ...

  2. 安卓selector

    定义styles.xml <?xml version="1.0" encoding="utf-8"?> <resources> < ...

  3. 安卓弹出对话框——Alertdialog(一)

    首先看各种样式的对话框: 我们看到,Dialog有很多的子类实现,所以我们要定义一个对话框,使用其子类来实例化一个即可,而不要直接使用Dialog这个父类来构造. 二.AlertDialog 今天我们 ...

  4. 那些年我们一起改过的bug

    ORA-01861: 文字与格式字符串不匹配 ORA-00936: 缺失表达式 ORA-01810 格式代码出现两次 ORA-01722: 无效数字 无效的列索引

  5. Spring Security——核心类简介——获得登录用户的相关信息

    核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和Authenti ...

  6. jq hide show

    var $ = function (id) { return document.getElementById(id); } //返回dom元素的当前某css值 var getCss = functio ...

  7. 超强JavaScript编辑器WebStorm代码提示迟缓问题及其它想到的

    去D2后发现 Hedger 的js编辑器是webStorm,便下载来试试,结果发现: 虽然WebStorm的js的提示远远不如aptana那么强悍(输入字母d不提示document),但是做为 Int ...

  8. Java jsp 示例

    <!DOCTYPE html> <!-- [ published at 2015-11-13 12:30:50 ] --> <html> <head> ...

  9. 解剖 Elasticsearch 集群 - 之三

    解剖 Elasticsearch 集群 - 之三 本篇文章是一系列涵盖 Elasticsearch 底层架构和原型示例的其中一篇.在本篇文章中,我们会讨论 Elasticsearch 如何提供准实时搜 ...

  10. STL内存管理

    1. 概述 STL Allocator是STL的内存管理器,也是最低调的部分之一,你可能使用了3年stl,但却不知其为何物. STL标准如下介绍Allocator the STL includes s ...