【发布时间】:2015-06-07 10:39:44
【问题描述】:
我对 Haskell 还是很陌生,为了更好地学习它,我开始到处解决问题,最终得到了这个 (project Euler 34)。
145 是一个奇怪的数字,因为 1! + 4! + 5! = 1 + 24 + 120 = 145。
找出所有数字之和等于其数字的阶乘之和。
注意:如 1! = 1 和 2! = 2 不是它们不包括在内的总和。
我写了一个 C 和一个 Haskell 蛮力解决方案。
有人能解释一下 Haskell 版本比 C 实现慢约 15 倍(约 0.450 秒 vs 约 6.5 秒),以及如何调整和加速 Haskell 解决方案?
unsigned int solve(){
unsigned int result = 0;
unsigned int i=10;
while(i<2540161){
unsigned int sumOfFacts = 0;
unsigned int number = i;
while (number > 0) {
unsigned int d = number % 10;
number /= 10;
sumOfFacts += factorial(d);
}
if (sumOfFacts == i)
result += i;
i++;
}
return result;
}
这里是haskell解决方案
--BRUTE FORCE SOLUTION
solve:: Int
solve = sum (filter (\x-> sfc x 0 == x) [10..2540160])
--sum factorial of digits
sfc :: Int -> Int -> Int
sfc 0 acc = acc
sfc n acc = sfc n' (acc+fc r)
where
n' = div n 10
r = mod n 10 --n-(10*n')
fc 0 =1
fc 1 =1
fc 2 =2
fc 3 =6
fc 4 =24
fc 5 =120
fc 6 =720
fc 7 =5040
fc 8 =40320
fc 9 =362880
【问题讨论】:
-
你用
-O编译了Haskell版本吗? -
一个用
-O2编译的非常相似的程序在我的电脑上运行0.55秒 -
和你的版本基本一样(0.54s)
标签: performance haskell