0
0

More than 3 years have passed since last update.

AtCoder Beginner Contest 169 A,B,Cまでをrubyで

Posted at

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

整数の掛け算なのだが、順に、
1. 0が一つでもあったら0
2. 10^18を超えたら即-1を返して終了
3. 要素全部の積を返す
で正解。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が簡単。
これも通せず。
精進します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0