AtCoderBegginersSelection "Shift only"
n個の整数 A1, ... , Anについて、次の操作を何回行えるか。
操作α:整数がすべて偶数であるときは、2で割ったものに置き換える
これなかなか難しかった。
2重ループにしないといけないということに気づくまでに時間がかかっちゃった。まず1つ目のループは、整数リストに対して、操作αを可能な限り繰り返すというループ。そして2つ目のループは、整数のリストの要素を1つずつとりだして、それが偶数であるかを確認し、2で割った商に置換するかどうかを行うという、操作αを具体化するループ。
2つ目のループ完了後に、中身が置き換わった新たな整数リストが出来上がっているので、それに対しても2つ目のループを再度行うという感じ。
import numpy as np # -*- coding: utf-8 -*- # 個数の入力 n = int(input()) # 黒板に書かれている整数リストの取得 numList = list(map(int, input().split())) # 何回除算ができるかのカウンタ divCnt = 0 # 整数リストをすべて2で割り切れることができたか divFlg = True #リストの要素がすべて2で割り切れる間は繰り返し while divFlg: # リストの要素分繰り返し for cnt in range(n): #取り出した要素が2で割り切れるか if numList[cnt] % 2 == 0: #割り切れた時は、その商をリストの要素に代入 numList[cnt] = numList[cnt] / 2 else : #割り切れなかったときはフラグをFalseにする divFlg = False #リストの要素をすべて2で割り切れた時だけ1回カウントする if divFlg: divCnt = divCnt + 1 print(divCnt)
2つ目のループが完了した後に、すべて2で割り切れたかを確認するために、論理値型のフラグを使いました。このフラグがTrueのときにのみ、操作αが一回完了したと解釈できるので、カウンタを1つインクリメントすることで実現しました。