49 lines
1.1 KiB
Elixir
49 lines
1.1 KiB
Elixir
defmodule Euler.Algebra do
|
|
def divisors(n) do
|
|
[ 1 |
|
|
(for i <- 2..floor(:math.sqrt(n))//1,
|
|
j = div(n, i),
|
|
j == n / i do
|
|
if i !== j, do: [i,j], else: [i]
|
|
end |> Enum.flat_map(&(&1))) ]
|
|
end
|
|
|
|
defp fact(1, acc), do: acc
|
|
defp fact(n, acc), do: fact(n - 1, n * acc)
|
|
@doc """
|
|
Computes n!
|
|
"""
|
|
def fact(0), do: 1
|
|
def fact(1), do: 1
|
|
def fact(n), do: fact(n - 1, n)
|
|
|
|
defp digit_sum(0, acc), do: acc
|
|
defp digit_sum(n, acc), do: digit_sum(div(n, 10), rem(n, 10) + acc)
|
|
@doc """
|
|
Returns the sum of the digits of `n`.
|
|
"""
|
|
def digit_sum(n), do: digit_sum(n, 0)
|
|
|
|
def fib(0), do: 1
|
|
def fib(1), do: 1
|
|
def fib(n) do
|
|
cache = Process.get(:fib, %{})
|
|
case Map.get(cache, n, nil) do
|
|
nil ->
|
|
value = fib(n - 1) + fib(n - 2)
|
|
cache = Process.get(:fib, %{}) |> Map.put_new(n, value)
|
|
Process.put(:fib, cache)
|
|
value
|
|
m -> m
|
|
end
|
|
end
|
|
|
|
def num_digits(0, acc), do: acc
|
|
def num_digits(n, acc), do: num_digits(div(n,10),acc+1)
|
|
def num_digits(0), do: 1
|
|
def num_digits(n) do
|
|
num_digits(n, 0)
|
|
end
|
|
end
|
|
|
|
|