B - Multiplication 2(ABC169復習)

5月31日に開催されたAtCoder Beginner Contest 169

ぱっと見簡単そうな問題だと思ったがACできなかったB問題を考える。

各問題の制約や入力・出力例はリンク先(AtCoderのサイト)へ。

B - Multiplication 2

問題文
N 個の整数 A1,...,AN が与えられます。
A1×...×AN を求めてください。
ただし、結果が 1018 を超える場合は、代わりに -1 を出力してください。 入力
入力は以下の形式で標準入力から与えられる。
N
A1 ... AN

B - Multiplication 2

提出したコード(不正解)

n = gets
ary = gets.split.map(&:to_i)
b = 1
ary.each do |a|
  b *= a
end
puts b > 10**18 ? -1 : b

結果:TLE(実行時間制限超過) 実行時間:2211 ms

これはTLEだろうな、と思いながらも他に思いつかなかった。

ACコード

正解者の方々のコードをいくつか見た後に自分なりに書いたコード。

n = gets
ary = gets.split.map(&:to_i)
b = 1
if ary.include?(0)
  puts 0
  exit
end
ary.each do |a|
  b *= a
  if b > 10**18
    puts -1
    exit
  end
end
puts b

考えたことを言語化してみる

ary(A1 ... AN)に0があればその時点で0を出力して終了。

aryの要素を掛けていって b に代入。
b が 10**18 より大きくなったら -1 を出力して終了。

exitが呼び出されずプログラムの最後までいったときはbを出力。

感想

順番が大事だった。

これぐらいさらっと解けるようになりたい。

もっといい変数名をつけたい。