Pythonで商と剰余を計算する方法:算術演算子とdivmod関数の使い分け

プログラミングにおいて、「割り算の答え(商)」と「その余り(剰余)」を求めたい場面は頻繁にあります。例えば、秒数を「何分何秒」に変換したり、アイテムを均等に配った余りを計算したりするケースです。

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 ÷ 604 あまり 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() の使用を推奨します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次