[解決!Python]割り算の商と余りを求めるには:解決!Python
//演算子と%演算子、divmod関数を使って2つの値の商と余りを求める方法を紹介。被除数や除数に負数が含まれている場合についても見てみる。
* 本稿は2022年8月9日に公開された記事をPython 3.11.5で動作確認したものです(確認日:2023年9月11日)。
# 商を求める
q = 7 // 3
print(q) # 2
# 余りを求める
r = 7 % 3
print(r) # 1
# 商と余りを一度に求める
q, r = 7 // 3, 7 % 3
print(f'q: {q}, r: {r}') # q: 2, r: 1
# divmod関数で商と余りを求める
q, r = divmod(7, 3)
print(f'q: {q}, r: {r}') # q: 2, r: 1
# 負数の扱い
# 正数を正数で除算して商と余りを求める
result = 7 / 3 # 正数を正数で除算
print(result) # 2.3333333333333335
q, r = divmod(7, 3)
print(f'q: {q}, r: {r}') # q: 2, r: 1
# 負数を正数で除算して商と余りを求める
result = -7 / 3 # 負数を正数で除算
print(result) # -2.3333333333333335
q, r = divmod(-7, 3)
print(f'q: {q}, r: {r}') # q: -3, r: 2
# 正数を負数で除算して商と余りを求める
result = 7 / -3 # 正数を負数で除算
print(result) # -2.3333333333333335
q, r = divmod(7, -3)
print(f'q: {q}, r: {r}') # q: -3, r: -2
# 負数を負数で除算して商と余りを求める
result = -7 / -3 # 負数を負数で除算
print(result) # 2.3333333333333335
q, r = divmod(-7, -3)
print(f'q: {q}, r: {r}') # q: 2, r: -1
//演算子と%演算子
除算(割り算)では、商(quotient)や余り(剰余、remainder)を求めることがある。元の数(被除数、割られる数)をa、割る数(除数、法)をn、商をq、余りをrとすると、これらの関係は「a = n × q + r」として表現できる。例えば、7を3で割った商は2、余りは1となる(7 = 3 × 2 + 1)。
Pythonである値を別の値で除算したときの商と余りを求めるには、//演算子と%演算子を使うか、divmod関数を使う。
//演算子(整数除算演算子、切り捨て除算演算子などと呼ぶ)は演算子の左側の項を被除数、演算子の右側の項を除数として「被除数を除数で割った商」を計算する。%演算子(剰余演算子、モジュロ演算子などと呼ぶ)は演算子の左側の項を被除数、演算子の右側の項を除数として「被除数を除数で割った際の余り」を計算する。
q = 7 // 3 # 商を求める
print(q) # 2
r = 7 % 3 # 余りを求める
print(r) # 1
これらの演算子を用いて、商と余りを同時に求めるには以下のように、代入演算子の左辺に商と余りを受け取る変数をカンマ区切りで並べ、右辺に商と余りを求める式をカンマ区切りで並べる。
q, r = 7 // 3, 7 % 3
print(f'q: {q}, r: {r}') # q: 2, r: 1
だが、このようなときにはdivmod関数を呼び出すのが簡単だ。
divmod関数
divmod関数は被除数と除数を受け取り、商と余りをタプルにまとめて返す。divmod関数の第1引数には被除数を、第2引数には除数を指定する。
以下にdivmod関数の使用例を示す。
q, r = divmod(7, 3)
print(f'q: {q}, r: {r}') # q: 2, r: 1
負数の扱い
被除数と除数のどちらか、あるいは両者が負数の場合には注意が必要だ。
以下は正数7を3で割った値を計算したものだ。
result = 7 / 3 # 正数の除算
print(result) # 2.3333333333333335
q, r = divmod(7, 3) # 正数を正数で除算して商と余りを求める
print(f'q: {q}, r: {r}') # q: 2, r: 1
通常の数学的な除算「7 / 3」の結果は「2.3333……」という値になる(上のコード例には誤差が含まれている)。そして、divmod関数で求めた商は2、余りは1となる。Pythonのドキュメントによれば、商は「数学的な除算に 'floor' 関数 を適用したもの」となる。floor関数は「引数に指定した値以下の最大の整数」を計算する関数だ。この例なら、「7 / 3」は「2.3333……」であり、それ以下の最大の整数とは「2」となる。
一方、負数-7を3で割った値を計算してみると次のようになる。
result = -7 / 3 # 負数の除算
print(result) # -2.3333333333333335
q, r = divmod(-7, 3) # 負数を正数で除算して商と余りを求める
print(f'q: {q}, r: {r}') # q: -3, r: 2
正数の除算のときとは異なり、商が「-3」となっている点に注目されたい。最初の計算にある通り、「-7 / 3」は「-2.3333……」であり、それ以下の最大の整数は-2ではなく-3だ。そのため、この例では商は-3となり、「-7 = 3 × -3 + r」を満たすrは「2」なので余りは2となる。
正数7を-3で割った場合の結果はまた異なる。
result = 7 / -3 # 負数の除算
print(result) # -2.3333333333333335
q, r = divmod(7, -3) # 正数を負数で除算して商と余りを求める
print(f'q: {q}, r: {r}') # q: -3, r: -2
Pythonでは剰余演算を行う場合、その結果の値の符号は、除数(割る数)の符号と同じになる。上の例では除数は-3のため、余りも負値となる(7 = -3 × -3 + (-2))。
最後に被除数と除数が共に負値の場合の例も示しておく。
result = -7 / -3 # 負数の除算
print(result) # 2.3333333333333335
q, r = divmod(-7, -3) # 負数を負数で除算して商と余りを求める
print(f'q: {q}, r: {r}') # q: 2, r: -1
被除数と除数に負値が含まれている場合、商と余りを求める方法が言語ごとに異なる場合がある。例えば、筆者が「-7を3で割った商」と「-7を3で割った余り」を求めるコードをC言語で記述したところ、商は-2、余りは-1となった(-7 = 3 × -2 + (-1))。これはPythonとC言語で商や余りを求める方法に違いがあるからだ(興味のある方は絶対値最小剰余/最小非負剰余などの語で検索してみよう)。商や余りを求める際に負数が含まれるときには注意しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.