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
べき乗
べき乗の計算(指数計算)は **
を使います。次のプログラムでは、 7 の 2 乗である 49 が出力されます。
print(7 ** 2)
実行結果
49
剰余演算
最後に、剰余演算(割った余りを計算する演算)です。 7 を 2 で割った余りは 1 なので、以下のプログラムでは 1 が出力されます。
print(7 % 2)
実行結果
1
負の数の切り捨て除算は、小さい方(絶対値が大きい方)に丸められると説明しましたが、剰余演算もそれと整合的に計算されます。より具体的には、正の整数の除算では a を b で割った商を q 、余りを r とすると a = b \times q + r\ (0\le r<b) が成立しますが、 a が負の数の場合も b が正であればこれが成立します。
例えば -11 を 5 で割ると -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 と等しいですが、場合によっては有効桁数の関係で値が変わることもあります。競技プログラミングでもこれによる失敗をするケースがあります。整数範囲で考えている場合は整数除算 //
を使うのが無難です。
発展的な内容
負の除数による除算
競技プログラミングでは敢えて除数を負にする必要があるケースはあまり見かけませんが、思わぬ罠になる可能性があるので、プログラムの挙動について説明しておきます。
a を b で割った商を 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
a を b で割った商は a // b
、余りは a % b
で取得できることは既に学びましたが、 divmod
関数を使うことでこれらを同時に取得することもできます。
具体的には、 divmod(a, b)
で a を b で割った商と余りのタプルを返します。「タプル」についてはまだ扱っていないので詳細は省略しますが、次のようなコードで取得できることを覚えておけば十分です。
q, r = divmod(20, 7) print(q) print(r)
実行結果
2 6
問題
リンク先の問題を解いてください。