はじめに
Elixir で整数の桁数を取得する方法を二つ紹介します
桁数に応じて表示を変えたい場合や、 Advent of Code や AtCoder などでも使えます
Integer.digits を使用する方法
Integer.digits は整数を桁毎の数値配列に変換する関数です
例えば Integer.digits(123)
は [1, 2, 3]
になります
これを利用し、整数 $N$ の桁数 $n$ を以下のようにして求めることが可能です
n = N |> Integer.digits() |> length()
常用対数を使用する方法
正の整数 $N$ が $n$ 桁の場合、以下の式が成り立ちます
$$
n−1 \leqq log_{10} N < n
$$
$n-1$ は整数なので
$$
n−1 = \lfloor log_{10} N
$$
となり、
$$
n = \lfloor log_{10} N + 1
$$
と言えます
$\lfloor$ は小数点以下切り下げ
この数式を利用し、 Elixir では以下のようにして桁数を求めることができます
n = N |> :math.log10() |> floor() |> Kernel.+(1)
0 以下の整数や大きい数に対応する場合、パターンマッチで場合分けしましょう
defmodule Digits do
def get(0), do: 1
def get(n) when n < 0 do
get(-1 * n)
end
def get(n) when n > 1000000000000 do
n |> div(1000000000000) |> get() |> Kernel.+(12)
end
def get(n) do
n |> :math.log10() |> floor() |> Kernel.+(1)
end
end
まとめ
Elixir で整数の桁数を取得する方法を紹介しました
Integer.digits
を使用する方法は分かりやすいですが、配列を使うために遅いです
速度が求められる場合、常用対数を使った方法がオススメです
以下の記事で性能比較しています