AtCoderでPythonの勉強 その4

AtCoder

AtCoder Beggineres Selectionの問4、ABC081B – Shift onlyです

問題文
黒板に N 個の正の整数 A1,…,AN が書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.
・黒板に書かれている整数すべてを,2で割ったものに置き換える.
すぬけ君は最大で何回操作を行うことができるかを求めてください.

制約
1≤N≤200
1≤Ai≤109

入力は以下の形式で標準入力から与えられる。
N
A1 A2 … AN

出力
すぬけ君は最大で何回操作を行うことができるかを出力せよ.

それぞれの数字を2で割っていって、どれかの数が2で割れなくなるまでの回数を数えれば良さそう
最初に書いたコード

N = int(input())
A = map(int, input().split())

count = 0
isEven = True
while isEven:
        for i in range(N):
                if (A[i] & 1):
                        isEven = False
        count = count + 1
print(count - 1)

‘map’ object is not subscriptableというエラーが出ました
調べてみるとPython 2ではmapはリストを返していましたがPython 3ではオブジェクトを返すそうです(意味、よくわかってないです)

mapをlistにすればいいみたい。修正版です

N = int(input())
A = list(map(int, input().split()))

count = 0
isEven = True
while isEven:
        for i in range(N)
                if (A[i] & 1):
                        isEven = False
        count = count + 1
print(count - 1)

こんどは A[i] & 1 が
unsupported operand type(s) for &: ‘float’ and ‘int’
というエラーになりました。

あれ? 問2では

a, b = map(int, input().split())
if ((a * b) & 1):

で偶奇判定、出来たのになあ???

よくわからないけど、あきらめて愚直に半分にして2倍して比較

if (int((A[i] / 2)) * 2 != A[i]):

これで AC になりました。

提出したコード↓

N = int(input())
A = list(map(int, input().split()))

count = 0
isEven = True
while isEven:
        for i in range(N):
                if (int((A[i] / 2)) * 2 != A[i]):
                        isEven = False
                A[i] = A[i] / 2
        count = count + 1
print(count - 1)

(8月2日追記)タイトルが “Shift only” なので、割り算、掛け算ではなく右にシフトして左シフトで戻す、てのが求められてた解き方なのかも。

コメント

タイトルとURLをコピーしました