考虑修改后的欧拉问题 #4——“找到最大回文数,它是 100 到 9999 之间的两个数字的乘积。”
rev :: Int -> Int
rev x = rev' x 0
rev' :: Int -> Int -> Int
rev' n r
| n == 0 = r
| otherwise = rev' (n `div` 10) (r * 10 + n `mod` 10)
pali :: Int -> Bool
pali x = x == rev x
main :: IO ()
main = print . maximum $ [ x*y | x <- nums, y <- nums, pali (x*y)]
where
nums = [9999,9998..100]
- 这个 Haskell 解决方案使用
-O2
和ghc 7.4.1
大约需要18 秒。 - 类似的
C
解决方案需要0.1 秒。
所以 Haskell 慢了 180 倍。我的解决方案有什么问题?我认为 Haskell 可以很好地解决这类问题。
附录 - 模拟 C 解决方案:
#define A 100
#define B 9999
int ispali(int n)
{
int n0=n, k=0;
while (n>0) {
k = 10*k + n%10;
n /= 10;
}
return n0 == k;
}
int main(void)
{
int max = 0;
for (int i=B; i>=A; i--)
for (int j=B; j>=A; j--) {
if (i*j > max && ispali(i*j))
max = i*j; }
printf("%d\n", max);
}