2016-10-24 4 views
0

그래서 저는 뭔가를하려고 노력하고 있습니다. 거의 거기에 있습니다. 그러나 나는 그것의 마지막 부분을 해결할 수 없습니다. 나는 누군가가 번호를 제공하는 코드를 확인해야합니다 (의 22을 만들어 보자)는 내가 22보다 작은 두 개의 숫자 곱하면이 모든 대칭 수를 찾을 필요가 : 반복되지 않는 회문수를 만들려면 어떻게해야합니까?

a*b의 모든 대칭 수를 찾기를 그러나 a < n && b < n. 그러나 그들은 반복 할 수 없다. 우리가 calc 22을 할 경우

나는 결과가
[11,22,33,44,55,66,77,88,99,171,121,252,272,323] 

을해야하지만

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

때문에 14x18 = 12x21 = 252납니다이

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)] 

을 얻었다.

어디서 잘못 되었나요?

+0

편집 내용이 실제로 사용자 요구를 충족시키는 지 확인하십시오. 그렇지 않으면 자신의 게시물을 [편집]하십시오. – Zeta

+0

놀랍습니다! 고맙습니다!! –

+0

이것은 알고리즘의 문제를 해결하지는 못했지만'Data.Set.toList. Data.Set.fromList'를 실행하고 완료하십시오. – bheklilr

답변

0

글쎄, 당신은 모든 숫자가 고유해야합니다. 적어도 세 가지 주요 요인 (x * y * z = (x * y) * z = x * (y * z))이있는 모든 숫자에 대해 여러 가지 표현이 있습니다. 그래서 우리가 이것을 고칠 수있는 한 가지 방법은 그들에 대한 주요 요인 분석과 추론입니다. 그러나 그것은 아마도 과잉이다.

지금 당신이 Data.List과에서 sort을 사용할 수 있습니다

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

(또는 unique = map head . group 사용) :

대신, 우리는 우리의 정렬 된 목록의 모든 번호가 고유한지 확인하게하는 기능을 사용할 수 있습니다 실제 calUniuqe와 끝까지 :

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

그러나, 우리는,764을 만들 수 있습니다회문 체크를 독자적인 기능으로 옮기면 훨씬 쉽게 읽을 수 있습니다 :

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 없이도이 작업을 수행 할 수 있습니까? 나는 아직 그걸로 일할 수 없다 :/ 하지만 고마워! –

관련 문제