質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1316閲覧

python 10の9乗足す7の余り

fia

総合スコア57

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/02/22 05:11

質問

AtCoderで10の9乗足す7の余りで答えを出す問題が多々ありますが、以下の書き方で正解と不正解に分かれてしまい、なぜこうなるのかを教えてください。

#sumには合計値が入っていいる print(sum%(10**9+7)) #AC print(int(sum%(1e9+7))) #WA

どちらも10の9乗足す7で意味は同じはずなのですが、浮動小数点などでオーバーフローしているのが原因なのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1e9はfloat(浮動小数点)なので、sumもfloat化されて計算されますが、このsumの値がものすごい大きい数の場合、float化すると小さい桁が情報落ちし、正確ではなくなります。(今回の1e9側ももっと大きければ同様の現象が発生します。)

>>> float(43248975438843428) 4.324897543884342e+16 #最後の8が情報落ち

なので、最終的に計算結果が異なってきます。

>>> 43248975438843428 % (10**9+7) 136100603 >>> int(43248975438843428 % (1e9+7)) 136100599

投稿2020/02/22 05:36

yukkeorg

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

浮動小数点などでオーバーフローしているのが原因なのでしょうか。

オーバーフローではありませんが、浮動小数点数として扱われると有効桁を超える範囲の演算では結果が変わってきます。

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

can110

総合スコア38278

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問