プログラミングにおいて、「割り算の答え(商)」と「その余り(剰余)」を求めたい場面は頻繁にあります。例えば、秒数を「何分何秒」に変換したり、アイテムを均等に配った余りを計算したりするケースです。
Pythonでは、算術演算子を使って個別に計算する方法と、組み込み関数 divmod() を使って一度に算出する方法の2通りがあります。
この記事では、それぞれの計算方法と使い分けについて解説します。
1. 算術演算子 (// と %) を使う方法
Pythonには、商と剰余を求めるための専用の演算子が用意されています。
//(切り捨て除算): 割り算の商(整数部)を求めます。%(剰余演算): 割り算の余りを求めます。
具体的な使用例:時間の変換
例として、ある動画の再生時間「250秒」を、「何分何秒」という形式に変換するプログラムを作成します。
# 動画の総再生時間(秒)
total_seconds = 250
# 1分は60秒
seconds_per_minute = 60
# 商(分)を求める
minutes = total_seconds // seconds_per_minute
# 余り(秒)を求める
remaining_seconds = total_seconds % seconds_per_minute
print(f"総秒数: {total_seconds}")
print(f"再生時間: {minutes}分 {remaining_seconds}秒")
実行結果:
総秒数: 250
再生時間: 4分 10秒
250 ÷ 60 は 4 あまり 10 なので、正しく計算されていることがわかります。
2. divmod() 関数を使う方法(推奨)
商と余りの両方が必要な場合、divmod() 組み込み関数を使用すると、一度の計算で両方の値を取得できます。
構文:
商, 余り = divmod(割られる数, 割る数)
戻り値は (商, 余り) というタプルになるため、アンパック(変数への一括代入)を使って受け取るのが一般的です。
具体的な使用例:アイテムの分配
45個のクッキーを、7人の生徒に均等に配るケースを考えます。
# クッキーの総数
cookie_count = 45
# 生徒の人数
student_count = 7
# divmod で一人あたりの個数(商)と余りを同時に取得
per_student, leftover = divmod(cookie_count, student_count)
print(f"一人当たりの個数: {per_student}個")
print(f"余ったクッキー: {leftover}個")
実行結果:
一人当たりの個数: 6個
余ったクッキー: 3個
45 ÷ 7 = 6 あまり 3 です。 演算子を2回(// と %)使うよりも、divmod() を1回呼ぶ方がコードが簡潔になり、計算効率もわずかに良くなる場合があります。
補足:負の数の取り扱い
Pythonの剰余演算(%)は、「割る数(分母)」と符号が一致するように計算されるという特徴があります。
# 負の数を割る場合
val_a = -10
divisor = 3
# -10 // 3 は -4 になる(小さい方の整数へ丸められる)
quotient = val_a // divisor
# -10 % 3 は 2 になる
# 計算式: -10 = 3 * (-4) + 2
remainder = val_a % divisor
print(f"商: {quotient}, 余り: {remainder}")
実行結果:
商: -4, 余り: 2
他のプログラミング言語(C言語やJavaなど)では、-10 / 3 の余りが -1 になる実装も多いため、負の数を扱う際はPythonの仕様に注意が必要です。
まとめ
x // y: 商(整数)を求めます。x % y: 余りを求めます。divmod(x, y): 商と余りをタプル(商, 余り)で一度に返します。
両方の値が必要な場合は、可読性が高く効率的な divmod() の使用を推奨します。
