問題: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に足していきます。