Problem 20
https://projecteuler.net/problem=20
Problem16とだいたい同じ。
Pythonで書くと、
from itertools import * import sys def multiply(v, n): v2 = [] carry = 0 for d in v: carry, r = divmod(d*n+carry, 10) v2.append(r) while carry > 0: carry, r = divmod(carry, 10) v2.append(r) return v2 def e020(N): a = [1] for n in range(1, N+1): a = multiply(a, n) return sum(a) N = int(sys.argv[1]) print e020(N)
これをJuliaに翻訳して、
function multiply(v, n) v2::Array{Int} = [] carry = 0 for d in v m = d*n+carry r = m%10 carry = div(m, 10) push!(v2, r) end while carry > 0 r = carry%10 carry = div(carry, 10) push!(v2, r) end return v2 end function e020(N) a = [1] for n in 1:N a = multiply(a, n) end return sum(a) end N = parse(Int, ARGS[1]) println(e020(N))
やはり、2行目で型指定していないと遅い。
PyPyで、
$ time pypy e020.py 30000 511470 real 0m15.933s user 0m13.875s sys 0m2.016s
Juliaで型指定しないと、
$ time julia e020.jl 30000 511470 real 2m6.301s user 2m3.984s sys 0m0.594s
上のように型指定すると、
$ time julia e020a.jl 30000 511470 real 0m10.654s user 0m10.734s sys 0m0.500s
PyPyより速くなった。