5
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?

ElixirAdvent Calendar 2024

Day 1

【TIPS】Elixir で整数の桁数を取得する

Last updated at Posted at 2024-12-12

はじめに

Elixir で整数の桁数を取得する方法を二つ紹介します

桁数に応じて表示を変えたい場合や、 Advent of CodeAtCoder などでも使えます

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 を使用する方法は分かりやすいですが、配列を使うために遅いです

速度が求められる場合、常用対数を使った方法がオススメです

以下の記事で性能比較しています

5
0
5

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
5
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?