问题描述:用十进制计算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!

Python求解进制问题(阿里巴巴2015笔试题)相关推荐

  1. python千进制编码

    python千进制编码 """ 最近看到华为出了仓颉编程 都在说中文不合适, 说这话的人肯字是吃过不少苦的程序员,想让新来的人把他们吃过的苦再吃一遍. 编程最终都是要转为 ...

  2. python 16进制转10进制, 8进制转10进制, 2进制转10进制的方法

    python 16进制转10 进制, 8进制转10进制, 2进制转10进制 可以使用系统自带的 int 方法 具体如下: value = "0x1388" result = int ...

  3. python常用进制转换の方法

    python常用进制转换の方法 (正整数)任意进制转十进制 1.int()函数 ''' 描述 int() 函数用于将一个字符串或数字转换为整型. 语法 class int(x, base=10) 参数 ...

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

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

  5. Python整数进制间转换

    Python整数进制间转换 tips: 本文代码基于python3编写 代码仓库 Python进制 Python中能够识别二进制.八进制.十进制及十六进制,Python整数显示进制为十进制,其他进制作 ...

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

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

  7. python中进制转换关系

    python中进制转换关系 标题整数之间的进制转换: hex(16) # 10进制转16进制 print(hex(16) ) >>'0x10' oct(8) # 10进制转8进制 prin ...

  8. python的进制转换器,Python进制转换

    进制转换: 进制转换是人们利用符号来计数的方法. 进制转换由一组数码符号和两个基本因素"基数"与"位权"构成. 基数是指,进位计数制中所采用的数码(数制中用来表 ...

  9. Python | HEX16进制与RGB10进制颜色互转

    Python | HEX16进制与RGB10进制颜色互转 背景知识 hex → rgb 实例 hex ← rgb 背景知识 hex: E6004D or #E6004 rgb: [230, 0, 77 ...

最新文章

  1. 小议Python3的原生协程机制
  2. ifs 报表开发手册_房地产开发资质要求《暂定资质证书》相关规定
  3. C# WinForm获取 当前执行程序路径的几种方法
  4. 大学计算机基础python第二次作业_python第二次作业-titanic数据集练习
  5. currenthashmap扩容原理_高并发编程系列:深入探讨ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)...
  6. 数据结构之查找算法:分块查找
  7. django-阻止某一个IP访问某一个页面
  8. WCF 第一章 基础 为一个ASMX服务实现一个WCF客户端
  9. 统计匹配检索规则的物品数量
  10. 分享微信朋友或朋友圈
  11. x86/x64编程基础
  12. mysql中设置create_time和update_time默认值并实时更新
  13. Win11设置定时关机命令没反应怎么办?
  14. oracle和timesten整合,Oracle TimesTen 关系型内存数据库18.1新版本详解
  15. 研发项目wbs分解简单案例_做项目WBS(工作分解结构)
  16. Gson解析json数据
  17. LCD1602_3.3V
  18. 仿淘宝ViewPager左滑加载详情界面
  19. android edittext的属性
  20. 2.SpringBoot整合Mybatis(一对一)

热门文章

  1. vscode怎么全局搜索_VS Code 新版本发布!支持远程开发、同步设置等新特性
  2. python print 分隔符_python print 使用分隔符 或行尾符
  3. 插入排序算法 java_排序算法实现-插入排序(Java版本)
  4. 截取台风后的图片_Python数据分析案例 | 台风最喜欢在我国哪个省市登陆
  5. maven junit空指针_Maven相关笔试面试题目
  6. java中如何引用非静态变量_java为什么不能从静态环境引用非静态变量?
  7. java runnable 启动_Java多线程:线程的创建与启动
  8. HttpClient 实现爬取百度搜索结果(自动翻页)
  9. Linux基本操作和知识
  10. 基于JAVA+SpringBoot+Mybatis+MYSQL的校园二手交易平台