1.贴题
题目来自PythonTip
结尾非零数的奇偶性
给你一个正整数列表 L, 判断列表内所有数字乘积的最后一个非零数字的奇偶性。如果为奇数输出1,偶数则输出0.。
例如:L=[2,8,3,50]
则输出:0
2.说明
这道题同样难在思路上。
首先简化问题,如果只要求判断奇偶性的话就很简单了,只要取列表中每个数的最后一位数看是否是偶数,只要出现偶数则最终一定是偶数,否则是奇数。
但是题目要求是非零数字,所以首先要考虑末尾有几个零。这样就转化为了上一道题
python之结尾0的个数
3.参考代码
temp,c = 1,0 #temp用来保存列表中每一个数从右边数第一个非零数
for x in L[::1]: #每次从列表L中取一个数
temp = temp*x #与temp相乘
t = str(temp) #转化为字符串方便取最后一位
for y in t[::-1]: #循环从后往前每次取一位
if y=='0': #如果遇到零
c += 1 #计数加一
else:
temp = int(y) #遇到第一个不为零的数,将其转换为int后保存至temp
break #跳出循环
if temp % 2 == 0: #列表中所有的数取完后,temp的值就是从右往左第一位非零数乘积的个位数,判断其奇偶性即可
print(0)
else:
print(1)
举个栗子来说明,
1. 列表为L=[2,8,3,50]
2. 首先temp=1,c=0
3. 从列表中取第一个数2
4. temp变为2
5. 最后一个非零位为2,temp还是2
6. 取第二个数8
7. temp变为16
8. 最后一个非零位6,temp变为6
9. 取第三个数3
10. temp变为18
11. 最后一个非零位8,temp变为8
12. 取第四个数50
13. temp变为400
14. 最后一个非零位4,temp变为4
15. 列表中全部元素取完了,判断temp奇偶性,为偶数,所以输出0
ps:上题python之结尾0的个数需要输出末尾零的个数所以需要使用c来存储计数,在本题中其实可以删除c部分,不影响结果。
4.其他写法
1.判断2和5的个数,2多则为偶,5多则为奇
来自AirFish
numOf2 = 0
numOf5 = 0
for key in L:
while key % 2 == 0:
numOf2 += 1
key /= 2
while key % 5 == 0:
numOf5 += 1
key /= 5
if numOf2 > numOf5:
print(0) #2比5多一定是偶数
else:
print(1)
2.直接舍去末尾的零
来自cyh
sum = 1
for i in L:
sum *= i
while sum % 10 ==0:
sum = sum//10
print(sum%2)
5.存档不考虑零的判断奇偶性代码
flag = False
for l in L:
m = int(str(l)[-1])
if m % 2 == 0:
flag = True
print(int(not flag))