0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで競プロするときの知識メモ3(整数・小数)

Posted at

1. はじめに

Python1でAtCoderを始めたので、覚えておきたいと思ったことをメモしていきます。
基本的には自分用ですが、Pythonで競プロを始める方の参考になればという気持ちも少しだけあります。

今回は整数・小数についてです。

2. 整数

Pythonで整数を扱うときは数値型のintを使います。
整数の精度は無制限2のため、32bit整数や64bit整数ということを意識する必要はありません。

以降、基本的には正の整数同士の演算を想定しています。(一部負の数まで含めて検証したものもあります)

四則演算

公式ドキュメントで組み込み数値型が対応している演算について表にまとめられています。
計算の順序も一般的な数式と同じです。

a = 6 + 2   # a: 8
b = 6 - 2   # b: 4
c = 6 * 2   # c: 12
d = 6 / 2   # d: 3.0 -> 「/」での割り算の結果は小数(float型)になる
e = 6 // 2  # e: 3

f = 6 * 2 + 10 // (4 - 2)  # f: 17

割り算の切り下げ、切り上げ

切り下げ(切り捨て)

演算子//を使います。
結果は常に負の無限大の方向に丸められます。

mathモジュールのfloor関数でも良さそうです。(※)

a = 1 // 2        # a: 0
b = -1 // 2       # b: -1  ※ 0にはならない
c = 1 // (-2)     # c: -1  ※ 0にはならない
d = (-1) // (-2)  # d: 0

※ 自分で試した訳ではありませんが、一部誤差が出るケースもあるようです。(参考

切り上げ

「整数aを整数bで割って切り上げた結果」は-(-a//b)で求めることができます。3
mathモジュールのceil関数でも良さそうです。(※)

a b a / b math.ceil(a / b) -(-a//b)
5 3 1.6666666666666667 2 2
-5 3 -1.6666666666666667 -1 -1
5 -3 -1.6666666666666667 -1 -1
-5 -3 1.6666666666666667 2 2
6 3 2.0 2 2
-6 3 -2.0 -2 -2
6 -3 -2.0 -2 -2
-6 -3 2.0 2 2

※ 誤差が出る場合があるかは未検証

割り算の余りを求める

演算子%を使います。

a = 5 % 3  # a: 2
b = 6 % 3  # b: 0

累乗を求める

演算子**を使います。
pow関数でも良さそうです。

a = 5**2       # a: 25
b = pow(5, 2)  # b: 25

2, 8, 16進数 ⇔ 10進数の変換

2, 8, 16進数 -> 10進数

方法はいろいろありそうですが、intのコンストラクタをよく使っています。

# "11"を第2引数で指定した数の進数として、10進数に変換する。
# 第1引数は文字列で指定する。

a = int("11", 2)    # a: 3
b = int("11", 8)    # b: 9
c = int("11", 10)   # c: 11
d = int("11", 16)   # d: 17
e = int("11", 37)   # 例外が発生 -> ValueError: int() base must be >= 2 and <= 36, or 0

※ intを使うと、2~36進数までの数を10進数に変換できます。

10進数 -> 2, 8, 16進数

組み込み関数のbin関数oct関数hex関数を使います。
format関数f-stringを使うとプレフィックスをなくすこともできます。

変換後の値は文字列になります。

a = bin(30)            # a: 0b11110
b = format(30, "#b")   # b: 0b11110
c = oct(30)            # c: 0o36
d = format(30, "o")    # d: 36 -> プレフィックス"0o"がつかない
e = hex(30)            # e: 0x1e
f = format(30, "#X")   # f: 0X1E -> 大文字に変換

3. 小数

Pythonで浮動小数点数を扱うときは数値型のfloatdecimalモジュールを使います。

四捨五入

round関数decimalモジュールのquantize関数を使います。

round関数では境界(= 5を四捨五入する)の場合に一般的な四捨五入と異なる挙動になります。
ただ、round関数の方が手軽に使えるため、十分小さな値を加えることで上記の問題を回避しつつ、roundで四捨五入を行うこともあります。(参考

例)正の小数の小数第3位を四捨五入する場合

from decimal import Decimal, ROUND_HALF_UP

x = 2.675
print(round(x, 2))
print(Decimal(str(x)).quantize(Decimal("0.01"), ROUND_HALF_UP))
x round dicimal
2.670 2.67 2.67
2.671 2.67 2.67
2.672 2.67 2.67
2.673 2.67 2.67
2.674 2.67 2.67
2.675 2.67 2.68
2.675005 2.68 2.68
2.676 2.68 2.68
2.677 2.68 2.68
2.678 2.68 2.68
2.679 2.68 2.68

以上です。
最後まで読んでいただきありがとうございました。

参考資料

その他の知識メモ

  1. 投稿日時点で使用しているPythonのバージョンは3.11.9です。

  2. ドキュメントにもIntegers have unlimited precisionとあり、マシンのメモリが許す限り大きな値を扱えるということですかね。

  3. 正の整数同士の割り算の切り上げだともう少しいろいろな計算方法がありそうですが、負の整数まで含めるとこの方法が良さそうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?