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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

320閲覧

どちらの処理も切り上げしているのに結果が異なる

Logarithm

総合スコア80

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/15 10:31

前提

ABC046 C問題を解いていたのですが、解法は思いついたものの、なぜかACしなかったので調べたら何故か以下の処理を使用していました。
何が違いなのですか?

方針

  • 今現在の高橋くんの票数 now_T
  • 今現在の青木くんの票数 now_A

として、
now_T >= nT[i]
now_A >= nA[i]
両方を満たすようなnを探す。探す方法としては上の不等式から、
max(now_T / T[i], now_A / A[i[)
ただし、切り上げをした値。

自分と他のコードの違い

自分は切り上げなので、math.ceil関数を使用。
調べたコードは (now_T + T[i] - 1) // T[i] としていた。

python

1import math 2 3 4N = int(input()) 5T, A = [None] * N, [None] * N 6for i in range(N): 7 T[i], A[i] = map(int, input().split()) 8 9for i in range(N): 10 if i == 0: 11 now_T, now_A = T[i], A[i] 12 continue 13 14 # my code 15 n = max(math.ceil(now_T/T[i]), math.ceil(now_A/A[i])) 16 # research code 17 n = max((now_T + T[i] - 1)//T[i], (now_A + A[i] - 1)//A[i]) 18 19 now_T = T[i] * n 20 now_A = A[i] * n 21 22print(now_T + now_A)

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python3で割り算に/を使うと、結果はfloatになります。
floatの有効桁は16桁弱しかないので、16桁以上の数値の計算だと、正しい結果にならない可能性があります。

python

1>>> (10000000000000001+2-1)//2 25000000000000001 3>>> math.ceil(10000000000000001/2) 45000000000000000 5>>> 10000000000000001/2 65000000000000000.0 7>>> float(10000000000000001) 81e+16

投稿2022/09/15 13:32

編集2022/09/15 13:51
actorbug

総合スコア2224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問