我们如何有效地计算 Elixir 中整数的位数?
How can we efficiently count the digits in an integer in Elixir?
我们如何在 Elixir 中高效地计算整数的位数?
我在 Iex 中的尝试
iex(1)> a=100_000
100000
iex(2)> Enum.reduce(1..a, &(&1*&2))|> to_string|> String.length
456574
iex(3)>
需要 15 秒
另一个实现:
defmodule Demo do
def cnt(n), do: _cnt(n,0)
defp _cnt(0,a), do: a
defp _cnt(n,a),do: _cnt(div(n,10),a+1)
end
慢得多:b = 100_000!
来自评论的建议(感谢 Fred!)
iex> Integer.to_char_list(b) |> length
目前为止最好而且最简单
IEx> :timer.tc(fn -> Demo.cnt b end)
{277662000, 456574}
IEx> :timer.tc(fn ->b |> to_string |> String.length end)
{29170000, 456574}
在任何 Elixir 模块中是否内置了 wizardry?
从 Elixir 1.1 及更高版本开始,现在有一个内置功能
Integer.digits/2
这有效地处理了数字计数
我们如何在 Elixir 中高效地计算整数的位数?
我在 Iex 中的尝试
iex(1)> a=100_000
100000
iex(2)> Enum.reduce(1..a, &(&1*&2))|> to_string|> String.length
456574
iex(3)>
需要 15 秒
另一个实现:
defmodule Demo do
def cnt(n), do: _cnt(n,0)
defp _cnt(0,a), do: a
defp _cnt(n,a),do: _cnt(div(n,10),a+1)
end
慢得多:b = 100_000!
来自评论的建议(感谢 Fred!)
iex> Integer.to_char_list(b) |> length
目前为止最好而且最简单
IEx> :timer.tc(fn -> Demo.cnt b end)
{277662000, 456574}
IEx> :timer.tc(fn ->b |> to_string |> String.length end)
{29170000, 456574}
在任何 Elixir 模块中是否内置了 wizardry?
从 Elixir 1.1 及更高版本开始,现在有一个内置功能
Integer.digits/2
这有效地处理了数字计数