4回目。前回C問題まで解けたので、今回もできるだろう、と舐めてかかったら、計算機工学の基礎のところでつまづく。
##A問題
abc169a.rb
ab = gets.chomp.split(" ").map!{|item| item.to_i}
puts ab[0] * ab[1]
書くだけ。
##B問題
abc169b.rb
n = gets.chomp.to_i
a = gets.chomp.split(" ").map!{|item| item.to_i}
num = 1
ans = 1
th = 10**18
a.sort!{|a,b| (-1)*(a <=> b)}
if a[n - 1] == 0
puts 0
exit
end
for num in 1..n do
ans = ans * a[num-1]
num = num + 1
if ans > th
puts "-1"
exit
end
end
puts ans
整数の掛け算なのだが、順に、
- 0が一つでもあったら0
2. 10^18を超えたら即-1を返して終了 - 要素全部の積を返す
で正解。cだと2のチェックを丁寧にやる必要があるが、rubyなら整数型で必要に応じて多倍長整数が使われるので気にしなくて良い。
2のチェックに早く引っかかるように逆順にソートして、末尾の要素が0かどうかを先にチェック、と書いたが、a.include?(0)か a.minで済む。
破壊的にソートする!をつけ忘れて通せず。
##C問題
abc169c.rb
ab = gets.chomp.split(" ")
a=ab[0].to_i
b=((ab[1].to_s).delete(".")).to_i
ans = a*b/100
puts ans
bを100倍してto_sで整数にして計算、100で割れば良いや、とやったところで、2進表現で循環小数になるパターンを踏んでwa。
bをintegerとして扱い、小数点を除いた後にto_sが簡単。
これも通せず。
精進します。