Python求解进制问题(阿里巴巴2015笔试题)

问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?

解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来不及。也就是说,应该是有更简单的方法。以我们最熟悉的十进制为例,一个数乘以10相当于左移1位而右边补0;了解二进制计算的朋友们应该知道,对一个二进制数乘以2相当于左移1位而右边补0。恭喜,这对于任意素数进制都是成立的。也就是说,把从1到30的整数简单因数分解一下,看看有多少个3,那么题目中最终计算结果末尾就有多少个0。

下面的代码有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] != '0':
            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)

#随机测试,验证结果
for _ in range(300000):
    n = randrange(5, 50)
    base = choice((2, 3, 5, 7))
    if zeros1(n, base) != zeros2(n, base):
        print('Error:', n, ':', base)

原题答案为14。

代码看不懂的地方随时可以留言,更欢迎发现和指出代码中可能存在的bug!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值