D - 1.03.四則演算と優先順位 Editorial /

Time Limit: 0 msec / Memory Limit: 0 KB

前のページ | 次のページ

キーポイント

演算子 計算内容
+ 足し算
- 引き算
* 掛け算
// 割り算(整数)
/ 割り算(実数 1
** べき乗
% 割った余り

(注)割り算の記号がふたつありますが、 // は整数での除算(切り捨て除算)、 / は実数(float)での除算です。違いについては後の例で説明します。

足し算・引き算・掛け算

Python で足し算・引き算・掛け算を行う場合は、 + - * を使います。

print(7 + 2) # 9
print(7 - 2) # 5
print(7 * 2) # 14
実行結果
9
5
14

割り算

割り算については少し注意が必要です。 // は整数範囲での割り算を計算し、切り捨てされた結果を整数として返します。一方で、 / は実数で計算した結果を(次節1.04変数と型で扱う float 型で)返します。

print(7 // 2) # 3
print(7 / 2) # 3.5
実行結果
3
3.5

切り捨て除算は、負の数を割った場合も小さくなる方向(絶対値が大きくなる方向)に丸められます。

print(-7 // 2) # -4
print(-7 / 2) # -3.5
実行結果
-4
-3.5

べき乗

べき乗の計算(指数計算)は ** を使います。次のプログラムでは、 72 乗である 49 が出力されます。

print(7 ** 2)
実行結果
49

剰余演算

最後に、剰余演算(割った余りを計算する演算)です。 72 で割った余りは 1 なので、以下のプログラムでは 1 が出力されます。

print(7 % 2)
実行結果
1

負の数の切り捨て除算は、小さい方(絶対値が大きい方)に丸められると説明しましたが、剰余演算もそれと整合的に計算されます。より具体的には、正の整数の除算では ab で割った商を q 、余りを r とすると a = b \times q + r\ (0\le r<b) が成立しますが、 a が負の数の場合も b が正であればこれが成立します。
例えば -115 で割ると -3 あまり 4 という計算になります。上の式に当てはめると -11 = 5 \times (-3) + 4 が成立することが確認できます。

print(-11 // 5)
print(-11 % 5)

実行結果
-3
4

演算子の優先順位

演算子には優先順位があります。
例えば 1 + 2 * 3 のような式を書いた場合、先に 2 \times 3 が計算された後に 1 が足され、計算結果は 7 になります。 * の優先順位が + より高いということです。
上で紹介した演算子の優先順位は次のとおりです。

優先順位 演算子
**
*
//
/
%
+
-
print(3 + 4 * 5) # 4 * 5 を先に計算する
print(5 * 3 ** 2) # 3 の 2 乗を先に計算する
実行結果
23
45

同じ優先順位の演算子が並んでいる場合は、左から順に計算されます。
括弧 ( ) を使うと、括弧で括った部分が先に計算されます。

print(4 * (1 + 2)) # 括弧の中の 1 + 2 を先に計算する
print(3 * 5 // 2) # 3 * 5 の結果を先に計算する
実行結果
12
7

注意点

ゼロ除算

ゼロで割り算を行おうとするとランタイムエラーになります。
次のコードはいずれもランタイムエラーになり、 AtCoder のジャッジだと RE が表示されてしまいます。

print(3 / 0)
print(3 // 0)
print(3 % 0)

割り切れる場合の実数除算

割り算をする際、たとえば 6 \div 3 のように割り切れる計算の場合、数学的には切り捨て除算と実数除算は同じ結果になりそうです。 Python では割り切れる場合であっても結果は少し異なります。具体的には、次節1.04変数と型で説明する「型」が変わます。

print(6 // 3)
print(6 / 3)
実行結果
2
2.0

この例では、(数学的な値としては)いずれも 2 と等しいですが、場合によっては有効桁数の関係で値が変わることもあります。競技プログラミングでもこれによる失敗をするケースがあります。整数範囲で考えている場合は整数除算 // を使うのが無難です。

発展的な内容

負の除数による除算

競技プログラミングでは敢えて除数を負にする必要があるケースはあまり見かけませんが、思わぬ罠になる可能性があるので、プログラムの挙動について説明しておきます。
ab で割った商を q 、余りを r とします。 b が正のときは a = b \times q + r\ (0\le r<b) が成立すると説明しましたが、除数 b が負のときは余りの範囲も負の方向になり、 a = b \times q + r\ (b < r \le 0) を満たすように商・余りが決まります。

11=(-5)\times(-3)+(-4) より、11-5 で割った商は -3 、余りは -4 となります。
-11=(-5)\times 2+(-1) より、-11-5 で割った商は 2 、余りは -1 となります。

print(11 // -5)
print(11 % -5)
print(-11 // -5)
print(-11 % -5)

実行結果
-3
-4
2
-1

divmod

ab で割った商は a // b 、余りは a % b で取得できることは既に学びましたが、 divmod 関数を使うことでこれらを同時に取得することもできます。
具体的には、 divmod(a, b)ab で割った商と余りのタプルを返します。「タプル」についてはまだ扱っていないので詳細は省略しますが、次のようなコードで取得できることを覚えておけば十分です。

q, r = divmod(20, 7)
print(q)
print(r)
実行結果
2
6

問題

リンク先の問題を解いてください。

EX3.計算問題

前のページ | 次のページ


  1. 正確には次節で紹介する float 型での計算であり、実数そのものを扱っている訳ではないですが、簡単のためこのページでは実数と記載しています。