问题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)