zoukankan      html  css  js  c++  java
  • 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 }
    View Code

    参考资料:微信号 Python_xiaowu 

  • 相关阅读:
    P1847 轰炸II
    c++ 如何对拍
    P2689 东南西北
    P2006 赵神牛的游戏
    P1320 压缩技术(续集版)
    vuex
    less
    将二维数组转化成一维数组
    剩余数组(从'水果数组'筛选掉'吃了的数组')
    将一维数组转化成二维数组
  • 原文地址:https://www.cnblogs.com/lateink/p/6422971.html
Copyright © 2011-2022 走看看