修正オイラー問題 #4 を考えてみましょう。「100 から 9999 までの 2 つの数の積である回文数の最大値を見つけてください。」
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]
-O2
とを使用したこの Haskell ソリューションに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);
}