2016-10-24 8 views
0

私は何かをしようとしています、それはほぼそこにありますが、私はそれの最後の部分を解決することはできません。私が22未満の2つの数値を乗算するときがあり、私は誰かが数を与えるコードをしなければならない(のが22作ろう)AN私はすべて回文数を見つける必要がある:繰り返しのない回文数字を作成するにはどうしたらいいですか?

a*bのすべて回文数を探しますa < n && b < n。彼らは自分自身を繰り返すことはできません。

私はこの

calc :: Int -> [Int] 
calc n = [a*b|a<-[1..n-1], b<-[a..n-1], a*b>10, reverse(show(a*b))==show(a*b)] 

を得た私たちはcalc 22をすれば結果は

[11,22,33,44,55,66,77,88,99,171,121,252,272,323] 

する必要がありますが、14x18 = 12x21 = 252ので、私は

[11,22,33,44,55,66,77,88,99,171,121,252,252,272,323] 

を取得しています。

どこが間違っていましたか?

+0

私の編集があなたのニーズを実際に満たしていることを確認してください。それ以外の場合は自分自身で投稿を編集します。 – Zeta

+0

ITは素晴らしいです!ありがとうございました!! –

+0

これはあなたのアルゴリズムの問​​題を解決するものではありませんが、 'Data.Set.toList。 Data.Set.fromList'を実行し、それを使って終了します。 – bheklilr

答えて

0

まあ、すべての番号が一意であることを確認する必要があります。少なくとも3つの素因数(x * y * z = (x * y) * z = x * (y * z))を持つすべての数に対して、複数の表現が存在します。ですから、これをタックすることができる方法の1つは、素因数分析とそれに関する推論です。しかし、それはおそらく過剰です。今、あなたはData.Listからsortを使用することができます(また、unique = map head . groupを使用)

unique :: Eq a => [a] -> [a] 
unique (x:y:xs) = if x == y then unique (y:xs) else x : unique (y:xs) 
unique xs  = xs 

とあなた:

代わりに、私たちはソートされたリスト内のすべての番号が一意であることを確認する機能を使用することができます実際calUniuqeで終わる:

calcUnique :: Int -> [Int] 
calcUnique = unique . sort . calc 

しかし、我々はを作ることができます私たちが回文チェックを独自の関数に移すと、読みやすくなります。

isPalindrome :: Int -> Bool 
isPalindrome n = n > 10 && reverse n' == n' 
    where n' = show n 

calc :: Int -> [Int] 
calc n = [a * b | a <- [1..n-1], b <- [a..n-1], isPalindrome (a * b)] 
+0

返事をありがとう、非常に有用! –

+0

Data.Listなしでも実行できますか?私はまだそれで動作することはできません:/ しかし、ありがとう! –

関連する問題