#ABC169 A,B,C問題解説
どうもs_y1127です。
本日行われたABC169のPythonによる解説を行いたいと思います。
(20/6/1 11:55追記)
乗算の表記を^で統一しました。
##A.Multiplication 1
###問題文
A×Bを求めてください。
###制約
1≤A≤100
1≤B≤100
入力は全て整数である。
###コード
A,B = map(int,input().split())
print(A*B)
簡単ですね。
入力したものを掛けるだけ。
##B.Multiplication 2
案外誤答が多かったB問題
###問題文
N個の整数
A1,...,AN
が与えられます。
A1×...×AN
を求めてください。
ただし、結果が
10^18
を超える場合は、代わりに -1 を出力してください。
###制約
2≤N≤10^5
0≤Ai≤10^18
入力は全て整数
である。
###コード
N = int(input())
A = list(map(int,input().split()))
ans = 1
if 0 in A:
ans = 0
N = 0
for i in range(N):
ans *= A[i]
if ans > 10**18:
ans = -1
break
print(ans)
あまりよろしいコードではないですが、、、
まず入力値の中に0があれば0でansを0にします。
また、Nも0に変更。
後々のfor文のRangeは配列の個数をlenで取らずにNで取るように設定し、
0が入ってなければ入力値のまま、0を代入していればfor文を実行せずに終了という想定です。
for文の中では全部掛け合わせるのではなく、あくまで1018内であるかどうかを確認してfor文を回し続けるかどうか決めています。
まぁ1018超えたら-1で出力するっていう制約があるのでそれ以上回す必要ないですしね、、、
(20/6/1 12:06追記)
コメントいただいたコードの方が見やすいと感じましたのでそちらを模範解答として掲載いたします。
ありがとうございます🙇♂️
N = int(input())
A = list(map(int,input().split()))
ans = 1
if 0 in A:
print(0)
exit()
for i in range(N):
ans *= A[i]
if ans > 10**18:
print(-1)
break
else:
print(ans)
##C.Multiplication 3
###問題文
A×B
の小数点以下を切り捨て、結果を整数として出力してください。
###制約
0≤A≤10**15
0≤B<10
Aは整数
Bは小数第2位まで与えられる
###AC例1(正攻法)
#ACになったコード
a, b = input().split()
a = int(a)
b = round(100*float(b))
print(a*b//100)
###AC例2(参考用)
上のは正攻法ですが、天才だなと思ったものも追記します。
#ACになったコード(その2)
a, b = input().split()
a = int(a)
b = int(b.replace('.',''))
print(a*b//100)
小数点取ることでこの制約では1つ目のコードと同じように100倍したことになる。
こういう発想を持ちたい!w
###反面教師用
ちなみに私ですが、、、
X = list(input().split())
A = int(X[0])
B = float(X[1])
ans = A * B
print(int(ans))
おそらくbの値は100倍にしないとダメなケースがあったんでしょうね、、、
うん、また頑張ろう、、、
(20/6/1 11:55追記)
単純に100倍にするだけでは誤差をなくすことはできないとのこと。
Pythonの場合選択肢としては
・Decimalにする
・1000倍にする
・Replaceで小数点を消すことによる100倍
・100倍してroundで丸め込む
でしょうか。
誤っていたら指摘いただけると幸いです。
(20/6/2 21:39追記)
上の中でテストケース的にたまたま通ってしまう物もあるようです。
浮動小数点のに関しては以下の投稿が詳細な説明をしているので確認してみてください。
浮動小数点数オタクが AtCoder Beginner Contest 169 のC問題をガチで解説してみる
##最後に
精進します。