竸プロ精進記 ABC100 C – *3 or /2 python 3

問題:https://atcoder.jp/contests/abc100/tasks/abc100_c

競プロでは頻出する、偶数、奇数の性質について考察するタイプの問題です。各数字について、3をかけるか、2で割るかの操作を行い、2で割れる数字が無くなったら終了。何回2で割れるかを回答することになります。

ここで重要なのは2で割れる回数です。3をいくらかけても2で割れる回数は増えません。なので3をかけることについては、何も考える必要はありません。完全に無視します。もともと与えられた数列が何回2で割れるかだけが問題です。

一回の操作で必ず一回は2で割る必要があるので、数列の中の各数値において何回2で割れるかを数え上げて回答すればOKです。

コード例

N=int(input())
a=list(map(int,input().split()))
ans=0
for i in range(N):
    if a[i]%2==0:
        tmp=a[i]
        while tmp%2==0:
            tmp=tmp//2
            ans+=1
print(ans)

for文でリストの各要素を2で割れるか、2で割れる場合には何回割れるかをansに数え上げていきます。

2で割ったあまりが0であれば2で割れる数なので、続けてwhile文で割れる限り割り続けます。ループを回した回数をansに足していきます。