Problem 12
https://projecteuler.net/problem=12
本当は速い方法があるが、ここでは愚直に順番に約数の個数を調べていく。
function factorize_naive(n) fs = [] for d in Iterators.countfrom(2) if d*d > n break elseif n%d == 0 e = 1 n = div(n, d) while n%d == 0 e += 1 n = div(n, d) end push!(fs, Pair(d, e)) end end if n != 1 push!(fs, Pair(n, 1)) end return fs end function num_divisors(fs) return reduce((x, f) -> x*(f.second+1), fs, init=1) end function T(n) return div(n*(n+1), 2) end function e012(N) for n in Iterators.countfrom(1) fs = factorize_naive(T(n)) num = num_divisors(fs) if num > N return T(n) end end end N = parse(Int, ARGS[1]) println(e012(N))
素因数分解の結果をArray{Pair{Int64,Int64}}で表している。Pairの要素へのアクセスは、first, secondを用いる。
なお、初期化で型を指定していないが、除算に時間がかかっているためあまり影響がない。