1.Python学习笔记之挑战Python-正整数列表的乘积结果问题

544 阅读2分钟

问题1:给你一个正整数列表 L, 如 L=[2,8,3,50], 输出L内所有数字的乘积末尾0的个数, 如样例L的结果为2.(提示:不要直接相乘,数字很多,可能溢出)

问题2:给你一个正整数列表 L, 如 L=[2,8,3,50], 判断列表内所有数字乘积的最后一个非零数字的奇偶性,奇数输出1,偶数输出0. 如样例输出应为0

问题3:给你一个正整数长列表 L, 如 L=[2,8,3,50], 输出L内所有数字的乘积的长度(乘积是几位数)

问题1和2的思路

在求职面试过程中,如果直接计算出乘积然后再模10来求解0的个数,基本上你已经跪了。 求解0的个数也就是有多少个10存在,即将10可以分解为2和5两个质因数,然后我们分别将列表中的元素分解为质因数2和5的个数。那么,我们可以发现,2和5分别统计的个数中的最小值就是最终列表中数字乘积中0的个数。 如果分别统计的2和5的个数中,2的个数大于5,那么最终乘积最后一个非0数字就是偶数,如果2的个数小于5,那么最后一个非0数字就是奇数

问题3思路

这个问题的解决思路会在此篇笔记的回复中答复,建议读者自己思考下解决办法(提示:可以考虑下N的阶乘的结果有多少位)

问题1 Python3代码

#!/usr/bin/env python

def SplitNumFromList( L ):
    uwTwoCountNum  = 0
    uwFiveCountNum = 0

    for item in L:
        while( 0 == ( item % 2 )):
            uwTwoCountNum += 1
            item = item // 2
        while( 0 == ( item % 5 )):
            uwFiveCountNum += 1
            item = item // 5

    return ( uwTwoCountNum, uwFiveCountNum )

L = [2,3,5,50]

newTwoCountNum, newFiveCountNum = SplitNumFromList(L)
print(newTwoCountNum if (newTwoCountNum < newFiveCountNum) else newFiveCountNum)

问题2 Python3代码

print(1 if (newTwoCountNum < newFiveCountNum) else 0)