Port 53

明日のための技術メモ

AtCoder ABC169

AtCoder ABC169解いた分だけまとめ。
ABC3完。BとCで結構教育的な問題が出ていい意味でしびれた。
ちなみに先日PAST受けたけど、残念ながら認定なしになってしまったので、引き続き精進します...

今の時点でのレートはこんな感じ。緑色目指してがんばるぞー

f:id:saturn-glave:20200607193758p:plain

目次

A. Multiplication 1

f:id:saturn-glave:20200607193812p:plain

問題文

やるだけ。以上。

ACしたコード

# coding:utf-8
a, b = map(int, input().split())
print(a * b)

B. Multiplication 2

f:id:saturn-glave:20200607193944p:plain

問題文

B問題でまさかTLE出すなんて思ってもいなかった。
まっとうにfor文でひたすら掛け算してから比べたらTLEだったので、
途中結果の時点で1018を超えたら打ち切りする方向で。
また、要素に1つでも0がいればその時点で0なので、それでも打ち切る。

ACしたコード

# coding:utf-8
n = int(input())
a = list(map(int, input().split()))
ans = 1

if 0 in a:
    print(0)
    exit()

for i in range(n):
    ans = ans * a[i]
    if ans > 10**18:
        print(-1)
        exit()

print(ans)

C. Multiplication 3

f:id:saturn-glave:20200607194813p:plain

問題文

aの入力の最大値が105なので、floatで扱うと誤差で爆死する。
正確に計算したいなら、decimalの出番。 標準ライブラリだが、使う時は import decimalが必要。

ポイント

  • 小数の計算を正確に計算するときはdecimalモジュールの出番
  • decimalで切り捨てする時は、decimal.quantize(num, rounding=decimal.ROUND_FLOOR))

ACしたコード

# coding:utf-8
import decimal
a, b = input().split()

ans = decimal.Decimal(a) * decimal.Decimal(b)
print(ans.quantize(decimal.Decimal('0'), rounding=decimal.ROUND_FLOOR))

参考

note.nkmk.me