題目描述
給你乙個正整數列表 l, 判斷列表內所有數字乘積的最後乙個非零數字的奇偶性。如果為奇數輸出1,偶數則輸出0.。
例如:l=[2,8,3,50]
則輸出:0
思路
最簡單的方法就是累乘,最後根據結果判斷非零數的奇偶性。但是這樣和結尾0的個數該題犯了一樣的記憶體錯誤。其實可以和這道題一樣,發現問題的本質。乙個數是由許多個因子相乘而來,那麼所有的數都可以分解成若干個不能再分解的因子,也就是奇數和偶數(更具體的說是質數相乘)。比如10可以分成1*10,但是10又可以繼續再分,所以最終是2*5.比如5就是5。(感覺有點類似於短除法)。
在換句話說,乙個數的奇偶性由什麼決定呢?就是取決於這個數的因子中2的個數。而問題中要求的是結尾非零數的奇偶性,那麼如果這個數結尾有0,直接去掉就可以,那麼因為不能求解這個數,如果去掉結尾的0呢?和結尾0的個數這道題一樣,10是由2*5組成,只需要去掉每一對2和5就可以。然後在考慮其他的因子。(其實其他的因子也不用考慮了 ,質數中只有2是偶數,其他的都是奇數,這樣,有2乘積才能是偶數,沒有2,乘積必定是奇數)
因為需要去掉結尾0數,所以求解2和5的個數,這樣,只需要比較2和5的個數就可以了(也就是最終能夠去掉多少個2,判斷剩餘的2能否使乘積為偶數)。
最後,如果去掉後還有2(也就是2的個數比5多),那麼不用說,結尾非零數必定是偶數;
如果去掉後沒有2也沒有5(也就是2和5的個數一樣),那麼這種情況下呢?我這裡其實是猜的,是奇數(因為如果是偶數,必定能分解出來乙個2,沒有偶數2,乙個數必定是奇數);
如果去掉之後沒有2,但有5(也就是5的個數比2多),這種情況就不用說了,一定是奇數。
# 這裡單獨給出乙個列表l
l=[2,8,3,50]
def solve_it():
num_t = 0
num_f = 0
for i in l:
while true:
if i % 2 == 0:
num_t += 1
i = i // 2
elif i % 5 == 0:
num_f += 1
i = i // 5
else:
break
if num_t <= num_f:
result = 1
else:
result = 0
return result
print(solve_it())
結尾非零數的奇偶性
描述 給你乙個正整數列表 l,如 l 2,8,3,50 判斷列表內所有數字乘積的最後乙個非零數字的奇偶性,奇數輸出1,偶數輸出0.如樣例輸出應為0 coding utf 8 l 2,8,3,50 product 1 for i in l product i def main global produ...
N!的最末位非零數
n!的最末位非零數 原帖 給定乙個數n n 10 1000 如何快速求得n!的最末位非零數是乙個經典的問題。一直以來都被這個問題困擾,今天仔細想了下,終於給想通了,儘管可能有些笨拙,現把想法記錄於此。在n很小的情況下,有乙個簡便的方法 求出1到n之間每個數的2的因子數和5的因子數,記為f 2 和f ...
TOJ1011 階乘末尾非零數求和
階乘末尾非零數求和 對於小於25000的自然數n,求階乘n n 1 n 2 3 2 1 右邊的非零數之和。例如 當n 5時,5 120,右邊非零數為2 4 24,右邊非零數為4 3 6,右邊非零數為6 2 2,右邊非零數為2 1 1,右邊非零數為1。其右邊的非零數之和為15。本題有多組資料,每組資料...