Q&A
解決済
2回答
1865閲覧
総合スコア57
Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。
0グッド
0クリップ
投稿2020/02/22 05:11
0
AtCoderで10の9乗足す7の余りで答えを出す問題が多々ありますが、以下の書き方で正解と不正解に分かれてしまい、なぜこうなるのかを教えてください。
#sumには合計値が入っていいる print(sum%(10**9+7)) #AC print(int(sum%(1e9+7))) #WA
どちらも10の9乗足す7で意味は同じはずなのですが、浮動小数点などでオーバーフローしているのが原因なのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
質問へのコメント
回答2件
ベストアンサー
1e9はfloat(浮動小数点)なので、sumもfloat化されて計算されますが、このsumの値がものすごい大きい数の場合、float化すると小さい桁が情報落ちし、正確ではなくなります。(今回の1e9側ももっと大きければ同様の現象が発生します。)
1e9
sum
>>> float(43248975438843428) 4.324897543884342e+16 #最後の8が情報落ち
なので、最終的に計算結果が異なってきます。
>>> 43248975438843428 % (10**9+7) 136100603 >>> int(43248975438843428 % (1e9+7)) 136100599
投稿2020/02/22 05:36
総合スコア985
浮動小数点などでオーバーフローしているのが原因なのでしょうか。
オーバーフローではありませんが、浮動小数点数として扱われると有効桁を超える範囲の演算では結果が変わってきます。
Python1sum = 123456789012345678 2 3f = sum*1e1 4print(type(f), f)# <class 'float'> 1.2345678901234568e+18 5i = sum*1 6print(type(i), i) #<class 'int'> 123456789012345678 7 8print(sum%(10**9+7)) # 148148162 9print(int(sum%(1e9+7))) # 148148164
Python
1sum = 123456789012345678 2 3f = sum*1e1 4print(type(f), f)# <class 'float'> 1.2345678901234568e+18 5i = sum*1 6print(type(i), i) #<class 'int'> 123456789012345678 7 8print(sum%(10**9+7)) # 148148162 9print(int(sum%(1e9+7))) # 148148164
投稿2020/02/22 05:32
総合スコア38350
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
15分調べてもわからないことはteratailで質問しよう!
ただいまの回答率85.25%
質問をまとめることで思考を整理して素早く解決
テンプレート機能で簡単に質問をまとめる
python 10の9乗足す7の余り